2008-11-06 14 views
9

Nach dem Verschieben eines Projekts von .NET 1.1 zu .NET 2.0, MsBuild sendet viele Warnungen für einige COM-Objekte.Viele Build-Warnungen, wenn COM-Objekte ActiveDs oder MSXML2 referenziert werden

Beispielcode für Test (Ist-Code keine Rolle spielt, nur verwendet, um die Warnungen zu erstellen):

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

Warnmeldungen aussehen

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: Warnung: Mindestens eines der Argumente für 'ITypeLib.RemoteGetLibAttr' kann vom Laufzeit-Marshaller nicht gemarshallt werden. Solche Argumente werden daher als Zeiger übergeben und erfordern möglicherweise unsicheren Code zur Manipulation.

Beobachtungen:

  • geschieht für ActiveDs (11 Warnungen) und MSXML2 (54 Warnungen).
  • Nicht für unsere eigenen COM-Objekte gesehen.
  • <Reference> Eintrag in CSPROJ Dateiattribut WrapperTool = "tlbimp"
  • Trotz aller Warnungen enthält, haben keine Probleme im laufenden System beobachtet.

Irgendeine Idee, wie man die Warnungen loswird?

+0

Haben Sie es jemals geschafft, dies herauszufinden? – Mario

+0

Leider nein. – gyrolf

Antwort

6

Laut einem Kommentar in der MDSN article about TLBIMP for 2.0, können Sie dieses Problem nicht ohne TLBIMP selbst beheben.

Es war einfach, Ihr Problem mit VS zu reproduzieren. Ich reproduzierte es auch TLBIMP manuell aus einer VS Kommentar Aufforderung:

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

Das Update war zu verwenden, um den Schalter/silent

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

Wie wies darauf hin, in dem Kommentar in dem MSDN-Artikel, den COM-Verweis wird zu einer .net-Assemblyreferenz für die Interop-Assembly, die Sie selbst erstellt haben.

Ich bin kein VS-Experte, aber ich habe diese Arbeit durch eine vorkompilierte zu Projekt hinzuzufügen:

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

es einmal gebaut, so dass ich eine DLL haben würde einen Verweis mit den Browse-Registerkarte hinzufügen . Ein Verweis auf die Datei interop.activeds.dll in meinem Projektstamm hinzugefügt und dann erneut erstellt. Möglicherweise möchten Sie dies auf eine andere Weise tun, z. B. mit einer externen Make-Datei über ein C++ - Projekt. Dies ist eher ein POC.

Beachten Sie einen lustigen Unterschied in MSBUILD vs VS, $ (DevEnvDir) hat einen abschließenden Backslash, aber MSBUILD nicht.

-2

Sie können mit den Warnungen stoppen:

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

wo Warnliste ein Komma getrennte Liste von Warn Zahlen.

Die Warnung bedeutet, dass die Typelib, die Sie importieren, etwas enthält, das in verwalteten Code nicht übersetzt werden kann, aber mit Zeigeroperationen in einem unsicheren Codeblock behandelt werden könnte. Der Code war in .Net 1.1 ebenfalls nicht übersetzbar, aber der Compiler war nicht schlau genug, um Sie vor der Falle zu warnen, in die Sie hineingeraten könnten, wenn Sie eine der Methoden verwenden, vor denen Sie gewarnt werden.

+2

Das Deaktivieren der Warnungen über #pragma funktioniert nicht, da die Warnmeldung keine Warnnummer enthält! Die Warnung wird nicht vom Compiler erstellt. Wahrscheinlich wurde es von TlbImp erstellt. – gyrolf

9

ich das gleiche Problem erlebt hatte und fixiert es die Projektdatei und bearbeite (CSPROJ), nach einem Vorschlag von hier:

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

Ich habe den folgenden Schlüssel auf die Eigenschaft Gruppe von jedem Build Konfiguration:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent> 
+1

Brilliant, das funktionierte, ohne TLBIMP verwenden zu müssen. –