2008-11-06 5 views
9

Po przeniesieniu projektu z .NET 1.1 do .NET 2.0, MsBuild emituje wiele ostrzeżeń dla niektórych obiektów COM.Wiele ostrzeżeń dotyczących budowania, gdy obiekty COM ActiveDs lub MSXML2 są przywoływane

Przykładowy kod dla testu (rzeczywisty kod nie ma znaczenia, po prostu wykorzystywane do tworzenia ostrzeżenia):

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); 
     } 
    } 
} 

Komunikaty ostrzegawcze wyglądać

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: warning: co najmniej jeden z argumentów dla "ITypeLib.RemoteGetLibAttr" nie może zostać zebrany przez agenta środowiska wykonawczego. Takie argumenty będą zatem przekazywane jako wskaźnik i mogą wymagać manipulowania niebezpiecznym kodem.

Uwagi:

  • zdarza Activeds ostrzeżeń (11) i (54 MSXML2 ostrzeżenia).
  • Niewidoczne dla naszych własnych obiektów COM.
  • <Reference> wpis w pliku .csproj zawiera atrybut WrapperTool = "tlbimp"
  • Pomimo wszystkich ostrzeżeń, nie zaobserwowano żadnych problemów w uruchomionym systemie.

Każdy pomysł, jak pozbyć się ostrzeżeń?

+0

Czy zdołałeś to jakoś rozwiązać? – Mario

+0

Niestety, nie. – gyrolf

Odpowiedz

6

Zgodnie z komentarzem w MDSN article about TLBIMP for 2.0, nie można rozwiązać tego problemu bez uruchamiania TLBIMP.

Łatwo było odtworzyć problem za pomocą VS. Ja też powielana to działa tlbimp ręcznie z komentarzem wierszu VS:

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

Rozwiązaniem było użycie przełącznika/Silent przełącznik

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

Jak podkreślono w komentarzu w artykule MSDN, odniesienie COM staje się odniesieniem do zestawu .net do złożonego wewnątrz układu współdziałania.

Nie jestem ekspertem VS, ale zrobiłem to dzieło, dodając prebuild do projektu:

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

Wbudowany raz tak musiałbym dll, aby dodać odwołanie z zakładce przeglądania . Dodano odwołanie do pliku interop.activeds.dll w moim katalogu głównym projektu, a następnie ponownie zbudowane. Możesz to zrobić w inny sposób, na przykład za pomocą zewnętrznego pliku make za pośrednictwem projektu C++. To jest bardziej POC.

Uwaga śmieszna różnica w MSBUILD vs VS, $ (DevEnvDir) ma końcowy ukośnik odwrotny, ale MSBUILD nie.

-2

można zatrzymać ostrzeżenia z:

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

gdzie lista ostrzegawcza jest oddzielona przecinkami lista numerów ostrzegawczych.

Ostrzeżenie oznacza, że ​​typelib, który importujesz, zawiera coś nieprzekładalnego w zarządzanym kodzie, ale może zostać potraktowany przy użyciu operacji wskaźnika w niebezpiecznym bloku kodu. Kod był nieprzetłumaczalny również w .Net 1.1, ale kompilator nie był wystarczająco inteligentny, aby ostrzec cię o pułapce, w którą możesz wejść, jeśli użyjesz jednej z metod, o których cię ostrzega.

+2

Wyłączenie ostrzeżeń za pośrednictwem #pragma nie działa, ponieważ komunikat ostrzegawczy nie zawiera żadnego numeru ostrzegawczego! Ostrzeżenie nie jest tworzone przez kompilator. Prawdopodobnie został stworzony przez TlbImp. – gyrolf

9

I nie doświadczył ten sam problem i naprawić go poprzez edycję pliku projektu (.csproj), zgodnie z sugestią stąd:

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

I dodaje następujący klucz do grupy właściwości każdej kompilacji konfiguracja:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent> 
+1

Świetnie, działało to bez konieczności używania TLBIMP. –

Powiązane problemy