Ich verwende DllImport, um auf einige Funktionen in einer C ++ - DLL aus meiner C # -Anwendung zuzugreifen.
Dieser Code funktioniert gut auf meinem Laptop, der Windows 7 64bit ist, die DLL selbst ist 32 Bit, so dass ich den Prozess hosting die DLL in 32bit laufen und es funktioniert gut. Wenn ich jedoch versuche, den gleichen Prozess auf meinem Zielrechner auszuführen, was wiederum Windows 7 64bit Ultimate ist, bekomme ich den Fehler "Ungültiger Zugriff auf den Speicherort". aus dem Prozess.
Ich bin nicht sicher, was das Problem ist, ich habe eine Menge Ressourcen im Netz angeschaut und keiner von ihnen hat es für mich gelöst. Ich verstehe nicht, warum es auf meiner Dev-Box funktioniert, aber nicht auf dem Ziel?
Die dll selbst ist in Ordnung, die Beispiele, die mit der dll kommen, funktionieren alle gut auf meiner Zielbox (das sind C # -Apps, die DllImport machen).
Hat jemand anderes dieses Problem? Bekämpfe es jetzt seit zwei Tagen!
Ausnahme: {"Unable to load DLL 'CLEyeMulticam.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)"}
Ich bemerke einen großen Unterschied zwischen Ihrer Entwicklungsmaschine und Ihrer Zielmaschine, der Entwicklungsumgebung. Stellen Sie sicher, dass alle erforderlichen Redistributables auf dem Zielcomputer vorhanden sind.
Bearbeiten: Ich habe ähnliche Probleme gesehen, wenn einige DLLs zu verschiedenen Versionen des .NET-Frameworks kompiliert wurden oder wenn sie mit verschiedenen Versionen von Visual Studio erstellt wurden, da die redistributables für jede Version unterschiedlich sind und die neuesten redistributables nicht genau sind abwärtskompatibel.
Ich hatte das gleiche Problem hier Natives Laden funktioniert gut. Laden von .net gibt Fehler Kann DLL 'my.dll' nicht laden: Ungültiger Zugriff auf den Speicherort
Das Problem war in der DEP-Funktion. Wenn ich DEP nur für essentielle Programme einschaltete, gab es keine Wirkung. Aber als ich die DEP vollständig ausgeschaltet und meinen Server neu gestartet habe, ist der Fehler verschwunden. Das eine mehr, was ich getan habe - letzte Updates für .net 4.0 installiert
Die eine bemerkenswerte Sache - ich habe keine Fehler über DEP gesehen, nur mit "Speicher" -Fehler geschlossen.
Ich hatte dieses Problem schon einmal. Ich denke, Ihr Problem besteht darin, dass VS versucht, die Datei zu öffnen, aber keine Berechtigungen zum Lesen hat. Sie müssen sicherstellen, dass das verwendete Konto Zugriff auf die DLL hat. Versuchen Sie, die Benutzerkontensteuerung zu deaktivieren, um festzustellen, ob sie funktioniert, oder verwenden Sie ein Administratorkonto. Oder versuchen Sie, Full Control
in der DLL an Everyone
zu geben.
EDIT: Könnten Sie VS als Administrator ausführen (Rechtsklick - & gt; Als Administrator ausführen)? Könnten Sie die DLL auf Ihren Desktop stellen, um es zu versuchen? Gibt es einen Unterschied in der Ordnerstruktur zwischen Ihrem Arbeitscomputer und dem, der versagt? Kann die DLL auch gut laufen, wenn Sie sie außerhalb von VS ausführen (versuchen Sie es auch als Admin auszuführen)?
HTH
Ich hatte vorher ähnliche Probleme, versuche folgendes.
Ich habe ein Problem mit einer 64-Bit-.NET-Anwendung ("Any CPU") festgestellt, die versucht, eine native 32-Bit-DLL-Abhängigkeit zu laden. Ich habe die Fehlermeldung nicht vor mir, also kann ich Ihnen nicht sagen, ob es das gleiche Problem ist. Die Lösung für mein Problem bestand darin, mein Build auf x86-only zu ändern.
Wenn sich die Bitgröße der DLL in jeder Box ändert, gibt es möglicherweise Unterschiede in der Strukturgröße, sodass Ihre PInvoke-Signatur inkorrekt wird. Dies könnte leicht zu einem Pufferüberlauf führen und Stapelfehler im systemeigenen Code verursachen.
Wenn Sie den Fehler in Ihrer C # -App erhalten, zeigt diese Meldung oft an, dass der native Code etwas Böses im Speicher gemacht hat, das der ILM sehen kann - überprüfen Sie den Code in Ihrer DllMain-Routine, der vor Ihrem Aufruf aufgerufen wird geht tatsächlich durch - wenn es sich schlecht benimmt, würden Sie dieses Ergebnis sehen
@Merlyn Morgan-Graham Wir standen vor einem ähnlichen Problem. Wo haben wir die .Net-Anwendung mit "Any CPU" gebaut und versucht, mit 32-Bit-C ++ - DLL zu verwenden. Wenn wir die .Net-Anwendung im 64-Bit-Betriebssystem ausführen. Es läuft als 64-Bit-Programm und daher und ähnliches Problem. Nachdem ich in X86 geladen hatte, funktionierte der Aufruf von C ++ Dlls einwandfrei. Eine weitere wichtige Sache ist, wenn Sie C ++ DLL in Ihrem .Net-Code verwenden. Es würde eine angemessene Menge an Marshalling geben, daher ist es wichtig, sich an den Build-Typ zu halten (d.h. X86, irgendeine CPU oder X64).
Bitte überprüfen Sie auch den folgenden Link: Windows Vista: nicht ausführbar Laden der DLL 'x.dll': Ungültiger Zugriff auf den Speicherort. (DllNotFoundException)
Die naheliegende, aber wahrscheinlich lahme Lösung wäre, C # -Seite explizit für 32-Bit zu erstellen. Überprüfen Sie, wie Sie aus Proc-Host erstellen - programmatisch oder durch das Ausfüllen von Registrierungsschlüsseln oder ... könnte sein, dass auf anderen Box es eingerichtet wird, entweder 64-Bit-Hosting-Prozess oder versuchen in-proc-Aufruf, dh Laden .. Es ist eine Registry-Einstellung, vergessen Sie nicht, dass für gemischte 23/64 Bit Fälle gibt es zwei Zweige zu graben.
Ich stieß auf ein ähnliches Problem, als ich zu win7 wechselte. Möglicherweise müssen Sie Ihren (64-Bit-) Computer standardmäßig als 32-Bit-Computer einrichten, indem Sie den folgenden Befehl verwenden:
C: \ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Ldr64.exe setwow
Ref: Ссылка