MSBuild: ошибка TlbImp с момента обновления до версии VS 2010
с момента обновления моего проекта до VS2010, включая использование MSBuild v4 вместо 3.5 (и не внесение каких-либо других изменений), я получаю следующую ошибку сборки и не знаю, как ее исправить (журнал из CC.NET):
<target name="ResolveComReferences" success="false">
<message level="high"><![CDATA[C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe c:\Assemblies\NMSDVDXU.dll /namespace:NMSDVDXLib /machine:X64 /out:obj\x64\Release\Interop.NMSDVDXLib.dll /sysarray /transform:DispRet /reference:c:\Assemblies\Bass.Net.dll /reference:c:\Assemblies\LogicNP.FileView.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll ]]></message>
<error code="TI0000" file="TlbImp"><![CDATA[A single valid machine type compatible with the input type library must be specified.]]></error>
<warning code="MSB3283" file="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" line="1558" column="9"><![CDATA[Die Wrapperassembly für die Typbibliothek "NMSDVDXLib" wurde nicht gefunden.]]></warning>
<message level="high"><![CDATA[C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe c:\Assemblies\StarBurnX12.dll /namespace:RocketDivision.StarBurnX /machine:X64 /out:obj\x64\Release\Interop.RocketDivision.StarBurnX.dll /sysarray /transform:DispRet /reference:c:\Assemblies\Bass.Net.dll /reference:c:\Assemblies\LogicNP.FileView.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll ]]></message>
<error code="TI0000" file="TlbImp"><![CDATA[A single valid machine type compatible with the input type library must be specified.]]></error>
<warning code="MSB3283" file="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" line="1558" column="9"><![CDATA[Die Wrapperassembly für die Typbibliothek "RocketDivision.StarBurnX" wurde nicht gefunden.]]></warning>
</target>
Проблема. Необходимо указать единый допустимый тип машины, совместимый с библиотекой типов ввода.
Это относится только к сборке x64 моего проекта, x86 все еще работает нормально. По-видимому, он пытается построить сборку x64 interop из DLL x86, расположенную в "C:\Assemblies". При выполнении команды TlbImp с x64 DLL, которая находится в другом каталоге, она работает нормально. Однако я не знаю, как настроить свой проект для использования разных ссылок COM для сборки x86 и x64. ОС, на которой выполняется компиляция проекта, - это WinXP x86. Здание отлично работало при использовании VS2005 + MSBuild 3.5
Любая помощь будет высоко оценена.
Я попытался создать обновленный проект с помощью MSBuild v3.5, но это тоже не сработает. Он жалуется на неизвестные коды NoWarn (возможно, новый в 4.0).
Ответы
Ответ 1
Наконец я придумал "решение". Как указано в MS Connect, изменение поведения сборки x64 было явно преднамеренным. Начиная с VS2010 и более поздних версий, для сборки x64 вашего приложения требуется система сборки x64, поэтому мне пришлось обновить мою систему сборки до x64 (что в основном означает переустановку всего). Затем для сборки x64 вам нужно использовать версию MS64 для x64, которая находится в папке "Framework64" (подробнее о блог Visual Studio: Основываясь на сценариях Cross Targeting и 64-bit MSBuild).
Ответ 2
У нас была аналогичная проблема с ссылками com для x64 (но другое сообщение об ошибке), и оказалось, что AnyCPU отсутствовал в файле проекта (аналогично комментарию Адама Дрисколла). Это означало, что x86 interop использовался как для сборки x86 abd x64.
В файле csproj добавьте этот node под каждым node.
Когда проект построен, создается/используется независимый интерфейс платформы.
Ответ 3
Возможно, это связано с проблемой с вашим проектом, где отсутствует целевой объект платформы node: 64-разрядная версия COM-взаимодействия Visual Studio 2010
Не совсем уверен, что это одна и та же проблема...
Ответ 4
Я думаю, вы обнаружите, что это связано с тем, что целевая сборка должна быть скомпилирована для того же типа процессора, что и сборка проекта.
Считаете ли вы, что у вас есть 2 проекта, содержащих одни и те же файлы, обратитесь к версиям вашей целевой сборки x64/x86?
Это может означать наличие двух экземпляров VS, но, по крайней мере, все, что вам нужно сделать, это редактировать, затем переключаться и строить.
Проблема также может быть связана с тем, что вы пытаетесь создать 64-разрядный код на 32-битной ОС... Я не думаю, что, хотя только запуск кода был бы проблемой, насколько мне известно.