MSBuild:升级到VS 2010后出现TlbImp错误

时间:2010-05-10 16:04:35

标签: c# .net msbuild

自将我的项目升级到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仍然可以正常工作。显然,它试图从位于“C:\ Assemblies”中的x86 DLL构建一个x64互操作程序集。使用位于不同目录中的x64 DLL执行TlbImp命令时,它可以正常工作。但是,我不知道如何配置我的项目以使用不同的COM引用来进行x86和x64构建。正在编译项目的OS是WinXP x86。使用VS2005 + MSBuild 3.5时,构建工作正常

任何帮助都将受到高度赞赏。

我尝试使用MSBuild v3.5构建升级后的项目,但这也不起作用。它抱怨未知的NoWarn代码(可能是4.0中的新代码)。

4 个答案:

答案 0 :(得分:2)

我们在使用x64的com引用时遇到了类似的问题(但是错误消息不同),结果发现项目文件中缺少AnyCPU(类似于Adam Driscoll的评论)。这意味着x86互操作用于x86 abd x64版本。

在csproj文件中,在每个节点下添加此节点。 构建项目时,将创建/使用平台独立的互操作。

答案 1 :(得分:2)

我终于想出了“解决方案”。正如MS Connect所指出的那样,x64构建行为的变化显然是故意的。从VS2010及更高版本开始,应用程序的x64版本需要x64构建系统,因此我被迫将构建系统升级到x64(这基本上意味着重新安装所有内容)。然后,对于x64版本,您必须使用位于“Framework64”文件夹中的x64版本的MSBuild(有关Visual Studio blog: Building on Cross targeting scenarios and 64-bit MSBuild的更多详细信息)。

答案 2 :(得分:1)

这可能是由于您的项目缺少平台目标节点的问题:Visual Studio 2010 64-bit COM Interop Issue

不太确定这是否是同一个问题...

答案 3 :(得分:0)

我认为你会发现这是因为目标程序集必须编译为与项目构建相同的cpu类型。

您是否考虑过有两个包含相同文件的项目,然后参考目标程序集的x64 / x86版本?

这可能意味着有两个VS打开的实例,但至少你需要做的就是编辑然后切换和构建。

问题也可能是因为你试图在32位操作系统上构建64位代码......我不这么认为,据我所知,只运行代码就是一个问题。