Что такое C CLI-эквивалент управляемого c __typeof и __gc?

#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);