Инструмент для импорта библиотек типов в виде кода C #
-
19-08-2019 - |
Вопрос
Существует ли инструмент для импорта / преобразования библиотек типов COM в код C # вместо генерации сборки? Инструмент TLBIMP и класс TypeLibaryConverter генерируют только сборки.
Я добился некоторого успеха, разрывая определения C # ComImport
, запустив Reflector над сгенерированной сборкой Interop и скопировав вставленный дизассемблированный источник, но обычно для этого требуется некоторое ручное исправление перед компиляцией. Р>
Желаемой целью является отдельный EXE-файл без сателлитных библиотек Interop, поэтому, возможно, ответ заключается в использовании ILMerge для эффективного внедрения DLL взаимодействия в EXE-файл.
Я был уверен, что в прошлом я сталкивался с таким инструментом - но, возможно, он мечтал об этом: -)
Решение 3
Как я изначально подозревал, лучшее решение - это ILMerge . Я не могу быть избирательным в отношении частей COM API для встраивания, но он работает достаточно хорошо.
Вот командная строка события после сборки, которую я должен использовать достаточно легко:
set MERGEFILES=Interop.Foo.dll Interop.Bar.dll
if "$(ConfigurationName)" == "Release" (
ren "$(TargetFileName)" "_$(TargetFileName)"
"$(ProgramFiles)\Microsoft\ILMerge\ILMerge.exe" /out:"$(TargetFileName)" "_$(TargetFileName)" %MERGEFILES%
del "_$(TargetFileName)"
del %MERGEFILES%
)
Другие советы
Я не уверен, что это будет полезно для вас, но исходный код для управляемой версии Tlbimp.exe был выпущен на CodePlex . VS2010 определенно решит вашу проблему.
Сегодня это не поможет, но в следующей версии C # есть функция. Это называется NoPia или Type Embedding, в зависимости от того, какую презентацию вы прочитали. Эта функция по существу свяжет сборку PIA с любым проектом, на который вы ссылаетесь. Конечным результатом является один EXE, который не требует развертывания Interop / PIA DLL. Р>
Сообщение Миши на эту тему: http://blogs.msdn.com/mshneer/archive/2008/10/28/type-embedding-support-in-c.aspx
В краткосрочной перспективе вам, возможно, придется пойти с ILMerge или рефлектором + скопировать код. Р>