2010-05-10 91 views
11

因爲我的項目升級到VS2010,包括使用MSBuild V4而不是3.5(並沒有做任何其他更改),我得到以下建立錯誤,並不知道如何解決它(從CC.NET登錄):MSBuild:TlbImp錯誤,因爲升級到VS 2010

<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命令時,它工作正常。但是,我不知道如何將我的項目配置爲x86和x64版本使用不同的COM引用。該項目正在編譯的操作系統是WinXP x86。使用VS2005 + MSBuild 3.5時建設工作得很好

任何幫助將不勝感激。

我嘗試用MSBuild v3.5構建升級項目,但這也不起作用。它抱怨未知的NoWarn代碼(可能在4.0中是新的)。

+0

移動到TFS2010和VS2010後,我遇到了這個完全相同的錯誤。我們在AnyCPU中構建我們所有的項目,並且使用CC.NET時沒有任何問題(除非特別使用x86或x64),現在使用TFS。 – 2010-05-12 19:22:12

+0

現在把它帶到MS Connect上,讓我們看看會發生什麼:http://connect.microsoft。com/VisualStudio/feedback/details/711406/tlbimp-error-since-vs2010-a-single-valid-machine-type-with-the-input-type-library-must-specified – floele 2011-12-14 21:02:22

回答

2

我終於想出了「解決方案」。正如在MS Connect上指出的那樣,x64構建行爲的改變顯然是有意的。從VS2010及更高版本開始,x64構建系統需要用於應用程序的x64版本,所以我被迫將我的構建系統升級到x64(基本上意味着重新安裝所有內容)。然後,對於x64版本,您必須使用位於「Framework64」文件夾(有關Visual Studio blog: Building on Cross targeting scenarios and 64-bit MSBuild的更多詳細信息)的MSBuild的x64版本。

0

我想你會發現這是因爲目標程序集必須編譯爲與項目構建相同的cpu類型。

您是否考慮過有2個項目包含相同的文件,然後在其中引用目標程序集的x64/x86版本?

這可能意味着有2個VS實例打開,但至少你需要做的是編輯然後切換和構建。

這個問題也可能是因爲你正試圖在32位操作系統上構建64位代碼......但我不這麼認爲,只要運行代碼就會成爲問題,據我所知。

+0

我無法引用因爲它不是x64操作系統,因此不能註冊x64 COM DLL。 – floele 2010-05-20 15:14:20

2

我們有一個類似的問題與COM引用了x64(但是不同的錯誤消息),結果證明項目文件中沒有AnyCPU(類似於Adam Driscoll的評論)。這意味着x86 interop正在用於x86 abd x64版本。

在csproj文件中,在每個節點下添加此節點。 當項目建立時,創建/使用平臺獨立互操作。

+0

雖然我不能使用AnyCPU。我需要我的應用程序的x86和x64版本。 x86版本附帶x86 DLL,如果使用AnyCPU編譯它,它將在x64操作系統上以x64運行,無法加載已安裝的x86 DLL。 – floele 2011-11-12 15:13:12

+0

您不必將應用程序編譯爲anycpu,該標記將以anycpu形式導入資源,以便它可以在x86和x64版本中使用。 – Mahen 2011-11-28 12:58:56

+0

這不應該起作用,因爲我沒有使用「AnyCPU」配置進行編譯,而且它確實不起作用。 AnyCPU-PropertyGroups是否具有PlatformTarget也沒有區別。 – floele 2011-12-03 22:19:07

相關問題