2008-11-06 11 views
9

Sau khi di chuyển một dự án từ .NET 1.1 sang .NET 2.0, MsBuild phát ra rất nhiều cảnh báo cho một số đối tượng COM.Rất nhiều cảnh báo khi COM đối tượng ActiveDs hoặc MSXML2 được tham chiếu

Mẫu mã cho thử nghiệm (mã thực tế không quan trọng, chỉ được sử dụng để tạo ra các cảnh báo):

using System; 
using System.DirectoryServices; 
using ActiveDs; 
namespace Test 
{ 
    public class Class1 
    { 
     public static void Main(string[] args) 
     { 
      string adsPath = String.Format("WinNT://{0}/{1}", args[0], args[1]); 
      DirectoryEntry localuser = new DirectoryEntry(adsPath); 
      IADsUser pUser = (IADsUser) localuser.NativeObject; 
      Console.WriteLine("User = {0}", pUser.ADsPath); 
     } 
    } 
} 

thông điệp cảnh báo giống như

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: warning: Ít nhất một trong các đối số cho 'ITypeLib.RemoteGetLibAttr' không thể được sắp xếp theo trình tự thời gian. Do đó, các đối số như vậy sẽ được chuyển thành một con trỏ và có thể yêu cầu mã không an toàn để thao tác.

Quan sát:

  • xảy ra cho ActiveDs (11 cảnh báo) và MSXML2 (54 cảnh báo).
  • Không được thấy cho các đối tượng COM của chính chúng ta.
  • <Reference> mục trong file csproj chứa thuộc tính WrapperTool = "tlbimp"
  • Mặc dù tất cả các cảnh báo, không có vấn đề đã được quan sát trong hệ thống đang chạy.

Bất kỳ ý tưởng nào về cách loại bỏ các cảnh báo?

+0

Bạn đã bao giờ tìm ra điều này chưa? – Mario

+0

Thật không may, không. – gyrolf

Trả lời

6

Theo nhận xét trong MDSN article about TLBIMP for 2.0, bạn không thể khắc phục sự cố này bằng cách chạy TLBIMP.

Thật dễ dàng để tái tạo sự cố của bạn bằng cách sử dụng VS. Tôi cũng sao chép nó chạy Tlbimp bằng tay từ một VS comment nhắc:

tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll 

Cách khắc phục là sử dụng/im lặng switch

tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll 

Như đã chỉ ra trong các bình luận trong bài viết MSDN, tài liệu tham khảo COM trở thành một tham chiếu lắp ráp .net để lắp ráp interop bạn xây dựng cho mình.

Tôi không phải là một chuyên gia về VS, nhưng tôi đã thực hiện công việc này bằng cách thêm một prebuild cho dự án của:

"$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb 
      /namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll" 

xây dựng nó một lần vì vậy tôi muốn có một dll để thêm một tài liệu tham khảo với các tab trình duyệt . Thêm một tham chiếu đến interop.activeds.dll trong thư mục gốc của dự án của tôi và sau đó được xây dựng lại. Bạn có thể muốn làm điều này theo cách khác, giống như với một tệp tạo bên ngoài thông qua một dự án C++. Đây là một POC nhiều hơn.

Lưu ý sự khác biệt thú vị trong MSBUILD vs VS, $ (DevEnvDir) có dấu gạch chéo ngược nhưng MSBUILD thì không.

-2

Bạn có thể ngừng những lời cảnh báo với:

 
    #pragma warning disable warning-list 
    #pragma warning restore warning-list 

nơi danh sách cảnh báo là một dấu phẩy tách danh sách các số cảnh báo.

Cảnh báo có nghĩa là typelib bạn đang nhập chứa nội dung không thể dịch được vào mã được quản lý nhưng có thể được xử lý bằng cách sử dụng thao tác con trỏ, trong khối mã không an toàn. Mã này cũng không thể dịch được trong .Net 1.1, nhưng trình biên dịch không đủ thông minh để cảnh báo bạn về cái bẫy bạn có thể đi vào nếu bạn sử dụng một trong những phương pháp mà nó cảnh báo bạn.

+2

Vô hiệu hóa cảnh báo qua #pragma không hoạt động do thông báo cảnh báo không chứa số cảnh báo! Cảnh báo không được tạo bởi trình biên dịch. Có lẽ nó được tạo bởi TlbImp. – gyrolf

9

tôi đã trải qua cùng một vấn đề và cố định nó bằng cách chỉnh sửa hồ sơ dự án (csproj), sau một gợi ý từ đây:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild

tôi thêm chìa khóa sau vào nhóm tài sản của từng xây dựng cấu hình:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent> 
+1

Brilliant, điều này làm việc mà không cần phải sử dụng TLBIMP. –