Frage

ein Projekt von .NET 1.1 auf .NET 2.0 Nach dem Umzug, MsBuild emittiert viele Warnungen für einige COM-Objekte.

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 nicht von der Laufzeit Marshaler gemarshallt werden. Solche Argumente werden daher als Zeiger übergeben werden und kann unsicheren Code erfordern zu manipulieren.

Bemerkungen:

  • für ActiveDs Happen (11 Warnungen) und MSXML2 (54 Warnungen).
  • Nicht für eigene COM-Objekte zu sehen.
  • <Reference> Eintrag in CSPROJ Datei enthält Attribut WrapperTool = "tlbimp"
  • Trotz aller Warnungen haben keine Probleme im laufenden System beobachtet.

Jede Idee, wie man loswerden der Warnungen erhalten?

War es hilfreich?

Lösung

Nach einem Kommentar in der MDSN Artikel über TLBIMP für 2.0 , können Sie dieses Problem nicht beheben w / o läuft TLBIMP selbst.

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

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

Das Update war, um den Schalter / silent zu verwenden

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

Wie im Kommentar in dem MSDN-Artikel wies darauf hin, wird der COM Bezug auf die Interop-Assembly eine .NET-Assembly Referenz Sie selbst gebaut.

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 dem Browse-Registerkarte hinzuzufügen. Hinzugefügt einen Verweis auf die interop.activeds.dll in meinem Projekt Wurzel und dann wieder aufgebaut. Sie können sie auf eine andere Weise zu tun, wie mit einem externen Makefile über ein C ++ Projekt. Dies ist eher ein POC.

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

Andere Tipps

hatte ich das gleiche Problem erlebt und es Datei durch Bearbeiten des Projektes festgelegt (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 jeder Build-Konfiguration:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

Sie können die Warnungen stoppen mit:

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

, wo Warnliste ist eine durch Kommata getrennte Liste von Warn Zahlen.

Die Warnung bedeutet, dass die typelib Sie importieren etwas unübersetzbar in verwaltetem Code enthält, konnte aber bei der Verwendung von Zeigeroperationen behandelt werden, in einem unsicheren Code-Block. Der Code war unübersetzbar in .Net 1.1 als gut, aber der Compiler war nicht klug genug, Sie über die Falle zu warnen Sie gehen in könnten, wenn Sie verwenden Sie eine der Methoden, die Sie über es zu warnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top