Wie lade ich IIS zum Laden einer nativen DLL, auf die von meinem WCF-Dienst verwiesen wird?

8

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?

    
Chris Marasti-Georg 03.11.2011, 14:08
quelle

1 Antwort

9

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.

     
  1. 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.
  2.   
  3. 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.
  4.   
  5. Das Windows-System   Verzeichnis. Verwenden Sie die GetSystemDirectory-Funktion, um den Pfad von zu erhalten   Dieses Verzeichnis.
  6.   
  7. Das Windows-Verzeichnis. Verwenden Sie das GetWindowsDirectory   Funktion, um den Pfad dieses Verzeichnisses zu erhalten.
  8.   
  9. Die Verzeichnisse, die sind   aufgeführt in der Umgebungsvariablen PATH.
  10.   

Die angebotenen Lösungen sind wie folgt:

  
  1. Verwenden Sie DLLImport, um die DLL unter Verwendung eines relativen oder absoluten Pfads bei zu laden   Laufzeit.
  2.   
  3. 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.
  4.   

Es gibt auch einige komplexere Lösungen zu # 2, bei denen der PATH programmatisch aktualisiert wird.

    
Chris Marasti-Georg 03.11.2011, 15:10
quelle

Tags und Links