Ich habe einen WCF-Dienst, der C # -Code enthält, der auf eine C ++ / CLI-DLL verweist, die auf einige native DLLs verweist. Ich füge alle notwendigen DLLs in den bin-Ordner für meine IIS-Anwendung ein, aber wenn IIS die verwalteten DLLs lädt, scheint es, sie in ein tiefes Verzeichnis wie:
zu kopieren %Vor%Es kopiert jede gemanagte DLL in ein eigenes Verzeichnis und lädt es. Wenn es zu meiner C ++ / CLI DLL kommt, kopiert es es in ein Verzeichnis wie oben, und es ist dann nicht möglich, die Abhängigkeiten zu laden. Wenn ich manuell alle nativen DLLs in diesen Ordner kopiere, wird es ausgeführt, aber das ist keine großartige Lösung.
Meine web.config ist die von VS erstellte Bestandsliste mit einem auf einem MSDN-Artikel basierenden Endpunkt.
%Vor%Wie kann ich diese DLLs automatisch abholen lassen?
Aus dieser Beitrag scheint es, dass die nativen DLLs in bestimmten Verzeichnissen oder auf dem Pfad verfügbar sein müssen:
Der Hauptgrund für dieses Problem liegt in der Art des Betriebssystems lädt native DLLs zur Laufzeit. Native DLLs werden mit dem geladen folgende Logik, die die temporären ASP.net-Dateien noch nicht enthält der Ordner applications / bin. Dieses Problem tritt auch in jedem .Net auf Anwendung, wenn die native DLL nicht mit / im Ordner / bin enthalten ist die .EXE-Datei oder wenn sich die DLL nicht in der Pfadumgebungsvariablen befindet.
- Das Verzeichnis, von dem die Anwendung geladen wurde. Im Falle des ASP.Net, dies wird in% windir% \ Microsoft.Net \ Framework \ v ### \ aufgelöst oder% windir% \ system32 \ inetsrv für IIS 6.
- Das aktuelle Verzeichnis. Im Fall von ASP.Net wird dies in% windir% \ System32 \ inetsrv aufgelöst für IIS 6. Wenn Sie den integrierten Webserver verwenden, wird dieser in einen Pfad aufgelöst unter C: \ Programme \ Microsoft Visual Studio 8.
- Das Windows-System Verzeichnis. Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad von zu erhalten Dieses Verzeichnis.
- Das Windows-Verzeichnis. Verwenden Sie das GetWindowsDirectory Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
- Die Verzeichnisse, die sind aufgeführt in der Umgebungsvariablen PATH.
Die angebotenen Lösungen sind wie folgt:
- Verwenden Sie DLLImport, um die DLL unter Verwendung eines relativen oder absoluten Pfads bei zu laden Laufzeit.
- Legen Sie die PATH-Umgebungsvariable so fest, dass der ASP.Net-Prozess dies kann Suchen Sie die C ++ - DLL. Sie können diese Eigenschaft zur Laufzeit festlegen, so dass es betrifft nur den Prozess, in dem der Code ausgeführt wird. Sie können dies auch festlegen global in den Systemeigenschaften (Umgebungsvariablen | PATH Eigentum). Die programmgesteuerte Einstellung erfordert keinen Neustart und Sie können den PATH auf den Ordner / bin der Web-App verweisen, wenn Sie möchten um XCopy-Bereitstellungen Ihrer ASP.Net-Anwendung durchführen zu können. Hier sind die Schritte, um den Pfad programmgesteuert von ASP.Net zu setzen.
Es gibt auch einige komplexere Lösungen zu # 2, bei denen der PATH programmatisch aktualisiert wird.