Visual Studio 2010, TlbImp генерирует .net 4.0 interops в 2.0 проектах
В проекте С# мы добавляем ссылку на объект COM с помощью установки Add References, указывающей на COM-объект, который приводит к автоматической генерации сборки interop в среде IDE. Так что это хорошо и хорошо, но мы строим на основе .net 3.5 SP1 aka CLR 2.0, а сгенерированные interops используют 4.0 CLR, что делает их несовместимыми. Есть ли способ предотвратить это?
Я предполагаю, что другой вариант - настроить нашу сборку script, чтобы попробовать использовать tlbimp.exe с параметром /references? указать mscorlib v2.0?
Во всяком случае, я надеюсь, что там где-нибудь есть флаг.
Ответы
Ответ 1
Я столкнулся именно с этой проблемой. Решение, которое я нашел, это использовать версию 3.5 tlbimp из .Net Framework SDK (или Windows Platform SDK?), Расположенную в% ProgramFiles%\Microsoft SDK\Windows\v6.0A\bin, которая использовала CLR 2.
Я также нашел, что мне нужна эта информация, чтобы получить правильную библиотеку типов из файла exe, который я импортировал, поскольку VS будет использовать только библиотеку первого типа:
"Идентификатор ресурса может быть добавлен в файл библиотеки типов при импорте библиотеки типов из модуля, содержащего несколько библиотек типов.
tlbimp MyModule.dll\1
из http://msdn.microsoft.com/en-us/library/tt0cf3sx%28VS.80%29.aspx
Ответ 2
Решение проблемы заключается в настройке tlbimp.exe для запуска в версии 2.0.NET.
- Перейдите в папку C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin и откройте файл tlbimp.exe.config.
-
Добавьте следующие строки в файл в разделе конфигурации:
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
-
Сохраните файл, затем запустите исполняемый файл tlbimp.exe, как обычно.
Ответ 3
Если вы используете Build Events, попробуйте следующее:
"$(SDK35ToolsPath)tlbimp" tlbimp arguments
$(SDK35ToolsPath) указывает на C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin
И если вы хотите ссылаться на 4.0, $(SDK40ToolsPath) - это макрос, который указывает на файлы C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0.
В командной строке VS 2010 "где tlbimp" сначала отобразит tlbimp.exe в папке "Инструменты NETFX 4.0". Поэтому нам нужно $(SDK35ToolsPath) для 3.5 tlbimp.exe.
Ответ 4
У меня была такая же точная проблема, но даже с v2.0 от tlbimp.exe у меня все равно получается dll 4.0, которая не будет работать.
Я закончил с более простым решением, если кто-то столкнется с этим:
Зарегистрируйте dll с помощью regsvr32 (убедитесь, что вы запустили это как admin или вы получите сообщение об ошибке), а затем добавив ссылку в проект, вы найдете свою DLL на вкладке COM.
Работал как шарм!
Если вы не хотите создавать dll для взаимодействия с вашим приложением, вам нужно выяснить маршрут tlbimp.exe.
Ответ 5
Для меня (Visual Studio 2013) это было просто вопрос использования правильного исполняемого файла TlbImp.
Найдите тот, который вы используете по умолчанию:
where tlbimp
Который для меня был
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\TlbImp.exe
Вместо этого используйте один из более низкой версии, например
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp
который создал для меня сборку .Net 2, не нужно редактировать файл конфигурации. Вы можете использовать CorFlags для EXE, чтобы определить, какую .Net-версию он использует. Или вы можете просто использовать Corflags на выходе.
Ответ 6
Просто запустите
C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe
Чтобы создать библиотеку interops.Net version 2.0