Ich habe ein paar Beispiele wie dieses gesehen:
%Vor%Aber was ich nicht verstehe, ist, warum jemand das so tun würde, als würde er nur auf die DLL verweisen, so wie sie andere Bibliotheken tun? Der MSDN-Status: "Das DllImport-Attribut ist sehr nützlich, wenn Sie vorhandenen nicht verwalteten Code in einer verwalteten Anwendung wiederverwenden. Beispielsweise muss Ihre verwaltete Anwendung möglicherweise Aufrufe an die nicht verwaltete WIN32-API vornehmen." Aber ist das so, dass es nicht sinnvoll ist, auf eine nicht verwaltete DLL zu verweisen oder unmöglich?
"Aber, ist das sagen, es ist nicht sinnvoll auf eine nicht verwaltete DLL oder unmöglich sonst? "
Ja, genau so. Was Sie als "Verweisen auf eine DLL" denken, ist eigentlich "eine .NET-Assembly referenzieren" - es ist einfach so, dass die häufigste Art, die Art von Assemblierungen zu packen, auf die man sich bezieht, eine DLL ist.
DLLImport bezieht sich ausschließlich auf das Importieren von 'traditionellen DLLs' - d. h. die alle ihre Methoden exportieren, indem sie den ursprünglichen Windows DLL-Exportmechanismus verwenden.
Stellen Sie sich DLLImport als "UnmanagedImport" vor, und die Dinge könnten klarer sein.
Einige Bibliotheken wie user32.dll sind nicht verwalteter Code. Im Grunde bedeutet das, dass sie nicht über die erforderlichen Metadaten verfügen, um .Net zu erlauben, per Referenz mit ihnen zu kommunizieren (es gibt viel mehr, was dazu führt, aber hoffentlich gibt Ihnen das einen Vorsprung.)
Auf den Punkt gebracht:
Referenz hinzufügen wird für DLL-Dateien verwendet, die verwalteten Code enthalten
DllImport wird verwendet für: DLL-Dateien, die nicht verwalteten Code enthalten
Definitionen:
Verwalteter Code : Code, der nur unter der Verwaltung einer Common Language Runtime (CLR) virtuellen Maschine , normalerweise .NET Framework (oder Mono ).
Unmanaged Code : alle kompilierten Binärdateien, die direkt auf dem Betriebssystem ausgeführt werden ; DLLs, die mit etwas älter als Visual Studio .NET 2002 kompiliert wurden.
Weitere Details: Managed, Unmanaged, Native: Welche Art von Code ist das?
Der .NET-Plattformcode wird in verwalteten Code kompiliert und mithilfe von Assemblys gespeichert. Bei diesen Assemblys handelt es sich um .DLL-Dateien, jedoch nicht ALLE .DLL-Dateien sind Assemblys, die verwalteten Code enthalten. Sie können verwalteten Code nur mit dem Stil 'Verweis hinzufügen' verwenden.
Andere Sprachen und Entwicklungstechniken generieren .DLL-Dateien mit nicht verwaltetem Code, tatsächlich können Sie sogar mit ihnen interagieren (Methoden aufrufen), aber Sie benötigen das DLLImport-Attribut
Tags und Links c# dll visual-studio reference dllimport