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
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
.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.
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.
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.
Tags und Links c# dll visual-studio dllimport