3 Stimmen

Laden einer nativen DLL (32 Bit) in einem prozessinternen wmi-Anbieter (32 Bit) unter einem 64-Bit-Betriebssystem

Ich arbeite an einem prozessinternen wmi-Anbieter, der eine native Bibliothek eines Drittanbieters mit [DllImport] lädt. Der Speicherort der DLL ist auf c festgelegt: \mydllpath. Vor dem Laden der DLL habe ich in der Bind()-Methode des Anbieters das aktuelle Verzeichnis auf die DLL-Aktion gesetzt.

Environment.CurrentDirectory = Environment.ExpandEnvironmentVariables("%SystemDrive%") + " \mydllpath ";

Der Provider ist für 'Any CPU' gebaut und wird mit gacutil und installexe installiert.

gacutil.exe /if myprovider.dll

installutil.exe myprovider.dll

Es funktioniert problemlos auf allen 32-Bit-Windows-Plattformen. Aber auf 64-Bit-Plattformen (versucht mit Windows 7 64bit) funktioniert es nicht, wenn ich über WMIC teste. Aber wenn ich mit WMI Code Creator getestet, es funktionierte gut.

Nach der Fehlersuche stellte ich fest, dass folgender Fehler auftrat.

System.BadImageFormatException Zusätzliche Informationen: Es wurde versucht, ein Programm mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)

Nach der Suche nach Hilfe im Internet wurde vorgeschlagen, den Provider für x86 zu erstellen. Aber Anbieter mit x86 gebaut gibt einen anderen Fehler wie...

ERROR: Code = 0x80041013 Beschreibung = Provider-Ladefehler Einrichtung = WMI

Ich habe auch versucht, die nativen DLLs (eigentlich 2 DLLs und eine Sys-Datei) mit dem Befehlszeilenschalter /linkref zu laden, was aber nicht möglich war, weil die Sys-Datei mit /linkref nicht geladen werden konnte.

Ich schrieb einen Test C#-Client-Anwendung und halten alle Dateien in einem gleichen Pfad, es funktionierte gut. Ich hoffe, ich bin einige Konfigurationen für 64-Bit-Installation fehlt.

Für jede Hilfe wären wir sehr dankbar und bedanken uns im Voraus!

3voto

Erik Funkenbusch Punkte 91649

Brauchen Sie den Code in 64 Bit? Sie können Visual Studio anweisen, Ihren c#-Code in eine 32-Bit-Datei zu kompilieren und dann die nativen 32-Bit-DLLs zu verwenden. Dies wird auf einem 64-Bit-Betriebssystem gut funktionieren.

.NET kompiliert standardmäßig .net-AWL mit dem nativen Befehlssatz. In den Projekteinstellungen auf der Registerkarte "Build", wenn das Build-Ziel für "Any CPU" eingestellt ist, dann wird es zu 64-Bit auf 64-Bit-Plattformen und 32-Bit auf 32-Bit-Plattformen kompilieren.

Wenn Sie dies ändern und die 32-Bit-Kompilierung erzwingen (auf x86 setzen), dann wird es auch auf 64-Bit-Plattformen in 32-Bit kompiliert, so dass Sie Ihre 32-Bit-DLLs verwenden können.

UPDATE: Nach erneuter Lektüre Ihrer Frage geben Sie an, dass Sie einen prozessinternen WMI-Anbieter erstellen. Dies würde darauf hindeuten, dass der Anbieter möglicherweise 64-Bit auf 64-Bit-Plattformen sein muss (ich weiß nicht, ob das der Fall ist). Wenn ja, dann ja du bist aus dem Glück.

UPDATE2: Dieser Artikel scheint darauf hinzuweisen, dass WMI-Anbieter auf 64-Bit-Betriebssystemen nicht 64-Bit sein müssen, außer unter "seltenen Umständen", so dass Sie vielleicht mit einem 32-Bit-Anbieter auskommen können.

1voto

ralf.w. Punkte 1573

Tut mir leid, Kumpel, ich habe hier kein Glück. Wenn Ihr Prozess (der Hauptprozess, alles gestartet) läuft 64 Bit können Sie nicht laden 32 Bit native dlls.

ici ist ein Artikel, der einige der Schwierigkeiten beschreibt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X