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. Когда проект построен, создается/используется независимый интерфейс платформы.

Ответ 4

Я думаю, вы обнаружите, что это связано с тем, что целевая сборка должна быть скомпилирована для того же типа процессора, что и сборка проекта.

Считаете ли вы, что у вас есть 2 проекта, содержащих одни и те же файлы, обратитесь к версиям вашей целевой сборки x64/x86?

Это может означать наличие двух экземпляров VS, но, по крайней мере, все, что вам нужно сделать, это редактировать, затем переключаться и строить.

Проблема также может быть связана с тем, что вы пытаетесь создать 64-разрядный код на 32-битной ОС... Я не думаю, что, хотя только запуск кода был бы проблемой, насколько мне известно.