Что делает компилятор / компоновщик VC ++ при создании проекта C ++ с управляемым расширением - PullRequest
0 голосов
/ 31 марта 2010

Первоначальная проблема заключается в том, что я попытался перестроить проект C ++ с символами отладки и скопировал его на тестовую машину. Выходные данные проекта - внешний COM-сервер (файл .exe).

При вызове функции интерфейса COM происходит сбой вызова RPC: COMException (0x800706BE): сбой удаленного вызова процедуры.

Согласно проекту COM HRESULT, если код FACILITY равен 7, это на самом деле ошибка WIN32, а код ошибки win32 - 0x6BE, что является упомянутым выше «удаленным вызовом процедуры».

Все, что я делаю, это заменяю файл .exe сервера COM, исходный файл работает хорошо.

Когда я зарегистрировался в проекте, я обнаружил, что это проект C ++ с управляемым расширением. Когда я проверяю DLL с отражателем, он показывает, что есть еще 2 ссылки на сборку .NET.

Затем я проверил настройки проекта и ничего не нашел о дополнительных 2 сборочных ссылках. Я включил шоу, включающее опцию компилятора и подробную библиотеку компоновщика, и попытался проанализировать, ссылаются ли на сборку косвенно через файл .h.

Я собрал весь файл .h и grep для всех файлов с помощью '#using' '#import' и самого файла сборки.

Действительно, в одном из файлов .h присутствует «#using», но оно не относится к указанной сборке.

А что касается связанных библиотечных файлов .lib, то только один из .lib-файлов является побочным продуктом другого проекта C ++ с поддержкой управляемых расширений, все остальные создаются чистым традиционным проектом C ++. Для проекта C ++ с управляемыми расширениями я проверил выходную сборку DLL, она НЕ ссылалась на сборку 2.

Я даже пытаюсь получить доступ к дополнительному файлу сборки через filemon и procmon sysinternal, но процесс перестройки НЕ получает доступ к этому файлу.

Я очень озадачен моделью процесса компиляции и компоновки проекта VC ++ / CLI, где дополнительная ссылка на сборку просочилась в финальную сборку?

Заранее благодарим за любую вашу помощь.

1 Ответ

1 голос
/ 02 апреля 2010

Я решил проблему, и я хотел бы поделиться некоторым опытом:

  1. Компилятор VC ++ может рассматривать весь проект как включенный ManagedExtension, вы можете установить его через Свойства проекта-> Общие-> Поддержка общеязыкового языка.

  2. Вы также можете включить его для отдельного файла .cpp, но в файле .vcproj имя атрибута для всего проекта - «ManagedExtension», а атрибут для отдельного файла .cpp - «CompileAsManaged».

  3. Компиляция VC ++ встраивает ссылочную сборку во время компиляции, а не во время компоновки. Поэтому ссылка на конкретную версию сборки встроена в файл .obj. Я использую строки Cygwin утилита для извлечения названия эталонной сборки

  4. .lib файл - это просто архив .obj файлов

  5. С точки зрения компоновщика, нет разницы между собственным файлом .obj и файлом .lib. Метаданные кода MSIL просто хранятся в разделе (я полагаю) как данные.

Кстати, я пытался использовать рефлектор + рефлекс для взлома эталонной версии сборки, но эта функция не может работать со смешанной сборкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...