четверг, 14 ноября 2013 г.

Компиляция .NET плагинов AutoCAD, использующих TLB файлы

Столкнулся с такой проблемой: не удалось в MS Visual Studio 2012, установленной на Windows 7 x64 скомпилировать этот код для AutoCAD 2009 SP3 x86, хотя все ссылки были обновлены на версию x86 и библиотеки использовались версии 17, как и полагается.

Все ссылки переподключаю при смене целевой платформы, в соответствии с этими рекомендациями. Однако в процессе компиляции постоянно получал такую ошибку:
Error 1 A single valid machine type compatible with the input type library must be specified. D:\projects\msvs\test_projects\SheetSetTools\SheetSetTools\TlbImp

Warning 2 Cannot find wrapper assembly for type library "ACSMCOMPONENTS17Lib". Verify that (1) the COM component is registered correctly and (2) your target platform is the same as the bitness of the COM component. For example, if the COM component is 32-bit, your target platform must not be 64-bit.

Warning 3 The referenced component 'ACSMCOMPONENTS17Lib' could not be found.
При этом в браузере проекта жёлтым значком выделялась ссылка AcSmComponents17Lib, сгенерированная IDE на основе файла acsmcomponents17.tlb из каталога inc-win32. Конфигурация проекта была выбрана Release x86, в качестве целевой платформы так же указан x86. Складывалось впечатление, что для AutoCAD 2009 управляемая обёртка генерировалась не на ту разрядность, которая была указана в свойствах проекта, но за основу бралась разрядность операционной системы. 

Чтобы проверить своё предположение, я скопировал проект на машинку, работающую под управлением Windows XP SP3 x86 и в MS Visual Studio 2010 и попробовал собрать этот же проект. Сборка прошла успешно, без ошибок. На всякий случай проверил скомпилированный результат, загрузив полученную библиотеку в AutoCAD и запустив определённые в ней команды - всё работает.

Однако если на исходной проблемной машинке, работающей под управлением Windows 7 x64, попытаться скомпилировать этот проект для AutoCAD 2014 x86, то компиляция проходит успешно. Т. о. получается, что проблема наблюдается при попытке компиляции под указанную мною ранее "старую" версию AutoCAD.

Решение
Для того, чтобы решить обозначенную выше проблему, нужно при формировании управляемой оболочки, средствами tlbImp.exe, "вручную" указывать целевую платформу. Примеры здесь.

P.S. Однако позднее обнаружилась ещё одна проблема: каждая версия tlbimp.exe генерирует DLL обёртки под конкретную версию .NET и указать в качестве целевой иную версию .NET не представляется возможным (подробности здесь). 

Комментариев нет: