Ссылка на сборку COM в Visual Studio против преобразования сборки COM через tlbimp.exe - PullRequest
3 голосов
/ 03 апреля 2009

Когда я импортирую сборку COM (dll) в проект Visual Studio, добавив ее в качестве ссылки, я могу без проблем использовать сгенерированную эквивалентную сборку среды выполнения.

Однако, если я попытаюсь преобразовать одну и ту же COM-сборку в общую языковую сборку времени выполнения с помощью tlbimp, я столкнусь со всеми видами проблем.

Есть ли способ реплицировать настройки, которые Visual Studio использует с tlbimp? Или, другими словами, есть ли способ сгенерировать тот же класс взаимодействия, что и Visual Studio, с помощью tlbimp?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

это немного больше, вам также нужно использовать параметр / sysarray, иначе вы обнаружите, что ваше приложение будет случайным образом зависать с предполагаемыми исключениями EngineExceptions, ссылающимися на повреждение памяти.

Это даст вам идентичный код il, сгенерированный Visual Studio.

укажите параметр / namespace для соответствия (включая регистр) условию библиотеки в файле tlb. (можно использовать oleview.exe для непосредственного просмотра tlbs).

[остаток мозговой свалки] Преимущество использования tlbimp, особенно из сценария msbuild, заключается в том, что вы можете настроить свой продукт как для 64, так и для 32-битных целей.

в противном случае вы получите 64-битные цели сборки, используя tlbs, которые были последними regsvr32'd, которые, скорее всего, являются 32-битными com-объектами с 32-битными интерфейсами.

Если вы выполняете 64- и 32-битные операции, используйте оба параметра / reference и / tlbreference, чтобы он использовал команды interops и tlbs, которые вы передаете в командной строке, вместо того, чтобы искать их в реестре.

2 голосов
/ 05 апреля 2009

Я нашел решение сам. Чтобы скопировать настройки, которые Visual Studio использует с tlbimp, вам просто нужно использовать флаги / out и / namespace.

Флаг выхода используется для префикса «Interop». в сгенерированном файле, а флаг пространства имен используется для установки пространства имен по умолчанию для имени COM-сборки.

, например

tlbimp /out:Interop.MyCom.dll /namespace:MyCom MyCom.dll
...