2016-03-24 1 views
0

Ich muss einige Funktionen in unserem großen C# -Softwarepaket erstellen, das .NET-DLLs von einem Drittanbieter-Softwarepaket verwendet. Nicht alle unserer Kunden werden dieses Paket nutzen. Wenn ich einen Verweis auf diese DLLs in Visual Studio hinzufüge, kann ich auf die Objekte zugreifen, die ich von ihnen benötige, aber ich nehme an, dass das den Build für andere Entwickler in meiner Firma bricht, die dieses Third-Party-Paket nicht installiert haben.Wie integriere ich eine DLL, die nicht immer vorhanden sein wird?

Was ist der richtige Ansatz für mich, um auf diese Funktionalität von Drittanbietern zugreifen zu können, ohne dass die Dinge für Kunden und Entwickler, die das Paket nicht nutzen wollen, gelöst werden? Muss ich das angehen, indem ich meine eigene DLL als eine Schicht der Umleitung erstelle? Muss ich die Drittanbieter-DLLs zur Laufzeit dynamisch laden?

+1

Welche Technologie verwenden Sie? Ist die Anwendung eine .NET-Anwendung und die fragliche DLL eine .NET DLL oder eine native Windows DLL? – Codor

+1

Unseres ist .NET, und ich glaube, dass die fragliche DLL auch .NET ist. Ich kann es als eine Referenz in einer trivialen Anwendung hinzufügen und von C# aus aufrufen. – skiphoppy

+1

Sie kennen bereits die Antwort, sehr schwer zu erraten, was Sie sonst noch brauchen. Viele und viele Google-Treffer bereits auf einer "C# plugin framework" -Abfrage, brauchen Sie nicht mehr. –

Antwort

1

Nach meinem Verständnis wird eine .NET DLL nicht von der Anwendung geladen, bis sie tatsächlich benötigt wird. Das heißt, wenn auf die DLL verwiesen wird, aber keine Codeverzweigung erreicht wird, die sie verwendet, ist es nicht erforderlich, dass sie vorhanden ist. Vielleicht ist es in diesem Fall nicht notwendig etwas zu implementieren.

Das heißt, es ist möglich, eine Technik namens "hot loading" zu verwenden, was bedeutet, Reflektion zu verwenden, um explizit auf Typen zuzugreifen, die in einer .NET DLL enthalten sind. Die Technik wird in this question diskutiert.

+1

Wird die DLL benötigt, damit andere Entwickler unsere Anwendung erstellen können? – skiphoppy

+0

@skiphoppy denke so, es sei denn, es ist heiß geladen. – Codor

1

Zuerst prüfen, ob es bereits geladen wurde; Wenn nicht, prüfen Sie, ob die DLL vorhanden ist. Wenn ja, laden Sie sie dynamisch mit System.Reflection.Assembly.LoadFile. Der Grund, warum Sie überprüfen möchten, ob es bereits geladen wurde, liegt daran, dass der dynamische Lader häufig Speicher verschwendet, indem er zusätzliche Instanzen lädt.

Es wird ein bisschen mehr Arbeit sein, aber wenn Sie dies dynamisch handhaben, können Sie Funktionen in Ihrer Anwendung aktivieren/deaktivieren, die die Assemblierung abhängig davon erfordert, ob sie vorhanden ist. Dadurch werden unnötige Fehlerberichte von Benutzern minimiert wenn es nicht da ist.

Seien Sie vorsichtig beim Referenzieren der Baugruppe, wenn sie nicht da ist; Obwohl .NET normalerweise nur dann dynamisch geladen wird, wenn eine Assembly benötigt wird, werden neuere Versionen aggressiver geladen, um Startverzögerungen zu vermeiden. Auch wenn es jetzt funktioniert (und das hängt von der Gesamtkonfiguration ab), funktioniert es möglicherweise nicht in naher Zukunft.

0

Es sieht so aus, als ob ich dynamisches Laden wie beschrieben verwenden würde enter link description here. Redet zu Alberto, um zu zeigen, wie das dynamische Keyword mit seiner Antwort verwendet werden kann.

Verwandte Themen