代码之家  ›  专栏  ›  技术社区  ›  floele

msbuild:从升级到vs 2010后出现tlbimp错误

  •  11
  • floele  · 技术社区  · 14 年前

    由于我的项目升级到了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:\assembles”中的x86 dll构建一个x64互操作程序集。当使用位于不同目录中的x64 dll执行tlbimp命令时,它工作正常。但是,我不知道如何配置我的项目,以便为x86和x64版本使用不同的COM引用。正在编译项目的操作系统是winxp x86。使用vs2005+msbuild 3.5时,建筑运行良好

    任何帮助都将不胜感激。

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Mahen    13 年前

    我们对X64的COM引用也有类似的问题(但错误消息不同),结果发现项目文件中缺少anycpu(类似于AdamDriscoll的注释)。这意味着x86 interop被用于两个x86 abd x64版本。

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

        2
  •  2
  •   floele    11 年前

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

        3
  •  1
  •   Community Artem    7 年前

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

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

        4
  •  0
  •   War    14 年前

    我认为您会发现这是因为目标程序集必须编译为与项目生成相同的CPU类型。

    您是否考虑过让两个项目包含相同的文件,然后在其中引用目标程序集的x64/x86版本?

    这可能意味着打开了两个vs实例,但至少您需要做的是编辑、切换和构建。

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