Wie kann ich eine C # (verwaltete) DLL verwenden, die ich nicht habe?

8

Wie kann ich korrekt auf eine C # DLL verweisen, auf die ich keinen physischen Zugriff habe? (Ich habe tatsächlich die DLL, nur nicht alle Abhängigkeiten.)

Hintergrund:

Auf dem Zielcomputer sind ein Programm und viele voneinander abhängige DLL-Dateien in C:\FancyProgram installiert.

Ich muss eine einfache Anwendung schreiben, die auf dem Zielcomputer auf C:\SimpleProgram bereitgestellt wird.

Dieses einfache Programm muss einige Aufrufe in eine der DLL-Dateien unter C:\FancyProgram machen. Es ist eine .net verwaltete DLL

Auf meiner Entwicklungsmaschine habe ich nicht eine Kopie von FancyProgram . Ich habe diese eine DLL-Datei, aber ich habe keine davon viele Abhängigkeiten. Ich kann diese DLL auch nicht in SimpleProgram bündeln.

Was ist die richtige Methode, um diese DLL in meinem Visual Studio-Projekt zu verwenden und darauf zu verweisen, so dass meine SimpleProgram die DLL korrekt kompiliert, aber zur Laufzeit vom richtigen Ort lädt?

Danke

    
nonot1 10.02.2011, 16:57
quelle

4 Antworten

8

Meine Empfehlung ist, eine Fassade für die Funktionalität zu erstellen, die Sie von dieser DLL verwenden möchten. Und nicht direkt verwenden (referenzieren) - dynamisch auflösen und laden:
C # - Methode zum Laden der Assembly, zur Klasse und zum Aufruf der run () -Methode
Laden Sie die Assembly zur Laufzeit und erstellen Sie eine Klasseninstanz

    
zihotki 10.02.2011, 17:14
quelle
3

.Net wird sowieso spät binden. Solange Sie die .dll in keiner Weise referenzieren, bis Sie sie tatsächlich laden wollen, wird dies funktionieren.

Kumulieren Sie einfach alle Referenzen (Felder, Eigenschaften, Methoden, Instanzen) in eine separate Klasse oder ein Projekt und erstellen Sie nur dann eine Instanz, wenn Sie müssen. Sie können dann den Ladefehler versuchen. Wenn Ihre Anwendung ausgeführt wird, sehen Sie im Visual Studio-Ausgabefenster, wann versucht wird, welche DLL-Datei zu laden.

Sie können sich diese Ereignisse auch ansehen, damit Ihre App Fehler elegant behandelt:

%Vor%

Sie können auch den MEF -Ansatz verwenden. Es ist ein Framework für das späte Laden / Binden.

    
Tedd Hansen 10.02.2011 17:22
quelle
1

Vielleicht möchten Sie sich die Details von LoadLibrary , GetProcAddress und Marshal.GetDelegateForFunctionPointer ansehen.

Ich würde auch DLL zum Testen lokal erstellen, mit der gleichen Schnittstelle wie Ihre externe DLL. Wieviele Funktionalität Sie dort einsetzen, hängt von der Komplexität der Schnittstelle und Ihrer SimpleProgram ab.

Es gab einige ausgezeichnete Antworten auf meine alte Frage zum Importieren externer DLLs.

    
Mark Booth 10.02.2011 17:21
quelle
0

Uhhhh, was werden Sie tun, um es zu testen? Angenommen, Sie haben herausgefunden, dass Sie entweder sicherstellen müssen, dass sich die .dll im GAC befindet und auf diese Weise (im Idealfall) oder verweist, muss sich die .dll-Datei auf allen Computern an derselben Stelle befinden . Fügen Sie die DLL in Ihre Referenzen ein und markieren Sie sie als "Copy Local: false", damit Sie sie nicht bereitstellen. Viel Glück.

    
RobertG5 10.02.2011 17:02
quelle

Tags und Links