#c -cli #managed-c
Вопрос:
Я пытаюсь преобразовать старый проект c из VS2003 в VS2019. Часть этого, как я узнаю, заключается в переходе от управляемого C к C CLI, поскольку управляемый c был довольно быстро удален.
По большей части я справляюсь, но, похоже, не могу понять, что заменяет ключевое слово __typeof. Есть ли для этого заскочить? См.Ниже фрагмент кода для контекста в том, как он использовался.
private: System::ComponentModel::IContainer ^ components;
private:
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
System::Resources::ResourceManager ^ resources = gcnew System::Resources::ResourceManager(__typeof(USB::Form1));
.
.
.
}
Кроме того, есть еще один повторяющийся идентификатор __gc, о котором я нашел дополнительную информацию , но не уверен, что понимаю, чем его заменить.
Char chars __gc[] = gcnew Char __gc[bytes->Length * 2];
Char hexDigits __gc[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
bool ImageNumberUsed __gc[];
Кто-нибудь хорошо разбирается в этом и знает, какие правильные преобразования приведены выше?
Ответ №1:
Я не могу сказать, что я использовал много управляемого C , но я могу сказать, каковы эквиваленты C /CLI.
__typeof(type)
—>type::typeid
- Доступ
typeid
, как если бы это было статическое поле или свойство данного типа. - Возвращает объект типа
System::Type^
. - Пример:
gcnew System::Resources::ResourceManager(USB::Form1::typeid);
- Доступ
__gc[]
—> классcli::array
cli::array
является полноценным управляемым типом. Вы создаете его сgcnew
помощью , переменные объявляются с помощью шляпы^
и т. Д.cli::array
является общим для типа объекта, хранящегося в массиве, и для количества измерений в массиве (по умолчанию 1). Размер массива задается с помощью параметра конструктора (с использованием круглых скобок, а не квадратных скобок).- Переменные объявляются с именем типа,
cli::array
. Квадратные скобки используются для чтения и записи значений, а не для объявления типа или создания массива. - Если тип внутри массива является управляемым ссылочным типом, вам нужно будет включить шляпу
^
в общий тип. Пример:cli::array<String^>^ foo = ...
- Примеры:
cli::array<System::Char>^ chars = gcnew cli::array<System::Char>(bytes->Length * 2);
cli::array<System::Char>^ hexDigits = { '0', '1', .... };
- (Мне нравится говорить «Система».Символ, в качестве дополнительного напоминания о том, что это не то же самое, что строчные
char
буквы .)
- (Мне нравится говорить «Система».Символ, в качестве дополнительного напоминания о том, что это не то же самое, что строчные
cli::array<bool>^ ImageNumberUsed;
(Неинициализирован или равен нулю до назначения)- Двумерный:
cli::Array<String^, 2>^ stringGrid = gcnew cli::Array<String^, 2>(10, 10);