2010-05-10 29 views
11

kể từ khi nâng cấp dự án của tôi lên VS2010, bao gồm việc sử dụng MSBuild v4 thay vì 3.5 (và không thực hiện bất kỳ thay đổi nào khác), tôi gặp lỗi xây dựng sau và không biết cách sửa lỗi nó (đăng nhập từ CC.NET):Lỗi MSBuild: TlbImp kể từ khi nâng cấp lên 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> 

Vấn đề: Một loại máy hợp lệ tương thích với thư viện kiểu đầu vào phải được chỉ định.

Nó chỉ áp dụng cho bản dựng x64 của dự án của tôi, x86 vẫn hoạt động tốt. Rõ ràng, nó cố gắng để xây dựng một lắp ráp interop x64 từ DLL x86 nằm trong "C: \ Assemblies". Khi thực hiện lệnh TlbImp với x64 DLL nằm trong một thư mục khác, nó hoạt động tốt. Tuy nhiên, tôi không biết làm thế nào tôi có thể cấu hình dự án của tôi để sử dụng tài liệu tham khảo COM khác nhau cho x86 và x64 xây dựng. Hệ điều hành mà dự án đang được biên dịch là WinXP x86. Tòa nhà hoạt động tốt khi sử dụng VS2005 + MSBuild 3.5

Mọi trợ giúp sẽ được đánh giá cao.

Tôi đã thử xây dựng dự án được nâng cấp với MSBuild v3.5, nhưng điều đó cũng không hoạt động. Nó phàn nàn về các mã NoWarn chưa biết (có lẽ mới trong 4.0).

+0

Tôi gặp lỗi chính xác này sau khi chuyển sang TFS2010 và VS2010. Chúng tôi xây dựng tất cả các dự án của mình trong AnyCPU và không gặp bất kỳ vấn đề nào khi sử dụng CC.NET (trừ khi sử dụng x86 hoặc x64), và bây giờ làm với TFS. –

+0

Bây giờ, hãy mang nó lên trên MS Connect, hãy xem điều gì xảy ra: http://connect.microsoft.com/VisualStudio/feedback/details/711406/tlbimp-error-since-vs2010-a-single-hợp lệ-máy-loại-tương thích-với-đầu vào-loại-thư viện-phải-được chỉ định – floele

Trả lời

2

Cuối cùng tôi đã đưa ra giải pháp "". Như đã chỉ ra trên MS Connect, thay đổi trong hành vi xây dựng x64 rõ ràng là có chủ ý. Kể từ VS2010 trở lên, hệ thống xây dựng x64 là bắt buộc đối với bản dựng x64 của ứng dụng của bạn, vì vậy tôi buộc phải nâng cấp hệ thống xây dựng lên x64 (về cơ bản có nghĩa là cài đặt lại mọi thứ). Sau đó, đối với bản dựng x64, bạn phải sử dụng phiên bản x64 của MSBuild, nằm trong thư mục "Framework64" (chi tiết hơn về số Visual Studio blog: Building on Cross targeting scenarios and 64-bit MSBuild).

0

Tôi nghĩ bạn sẽ thấy điều này là do hội đồng được nhắm mục tiêu phải được biên dịch cho cùng một loại CPU như xây dựng dự án.

Bạn đã cân nhắc có 2 dự án chứa cùng một tệp rồi tham khảo phiên bản x64/x86 của hội đồng mục tiêu của bạn trong đó?

Có thể có 2 trường hợp VS mở nhưng ít nhất tất cả những gì bạn cần làm là chỉnh sửa rồi chuyển đổi và tạo.

Vấn đề cũng có thể là do bạn đang cố gắng xây dựng mã 64 bit trên hệ điều hành 32 bit ... Tôi không nghĩ vậy, chỉ chạy mã sẽ là vấn đề theo như tôi biết.

+0

Tôi không thể tham chiếu x64 DLL * ở tất cả * trên hệ thống trình biên dịch, bởi vì nó không phải là một hệ điều hành x64 và do đó không có DLL X64 COM có thể được đăng ký. – floele

1

Nó có thể là do một vấn đề với dự án của bạn, nơi các nút nền tảng mục tiêu là mất tích: Visual Studio 2010 64-bit COM Interop Issue

Không khá chắc chắn nếu điều này là cùng một vấn đề ...

2

Chúng tôi đã có một vấn đề tương tự với com tài liệu tham khảo cho x64 (nhưng thông báo lỗi khác nhau), và hóa ra là AnyCPU bị thiếu trong tệp dự án (tương tự như bình luận của Adam Driscoll). Điều này có nghĩa rằng các interop x86 đã được sử dụng cho cả hai x86 abd x64 xây dựng.

Trong tệp csproj, hãy thêm nút này dưới mỗi nút. Khi dự án được xây dựng, nền tảng độc lập interop được tạo ra/sử dụng.

+0

Tôi không thể sử dụng AnyCPU. Tôi cần cả một phiên bản x86 và x64 của ứng dụng của mình. Phiên bản x86 với các x86 DLL, và nếu tôi biên dịch nó với AnyCPU, nó sẽ chạy như x64 trên các hệ điều hành x64, không thể tải các tệp x86 đã được cài đặt. – floele

+0

Bạn không phải biên dịch ứng dụng dưới dạng anycpu, thẻ này sẽ nhập tài nguyên dưới dạng anycpu để nó hoạt động trong cả bản dựng x86 và x64. – Mahen

+0

Tính năng này không hoạt động vì tôi không sử dụng cấu hình "AnyCPU" để biên dịch và thực tế không hoạt động. Nó không tạo nên sự khác biệt cho dù AnyCPU-PropertyGroups có một PlatformTarget hay không. – floele

Các vấn đề liên quan