2009-04-03 1 views
3

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

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

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

ответ

2

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

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

например.

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

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

Это даст вам идентичный код, созданный визуальной студией.

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

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

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

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

+0

Благодарим за дополнительную информацию! – Fraser