Win 7 DllImport C # Ungerade Fehler, ungültiger Zugriff auf den Speicherort?

8

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)"}

    
James 24.07.2010, 22:03
quelle

10 Antworten

1

Das Laden der DLL kann aufgrund nicht aufgelöster Abhängigkeiten zum Absturz führen. Öffnen Sie daher Ihre DLL auf dem Zielcomputer mit Dependency Walker und sehen Sie, ob Probleme auftreten.

    
Jarlaxle 28.07.2010 07:52
quelle
1

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.

    
Jack 29.07.2010 00:50
quelle
1

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.

    
Alex Blokha 22.03.2011 13:16
quelle
0

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

    
TheCloudlessSky 25.07.2010 14:44
quelle
0

Ich hatte vorher ähnliche Probleme, versuche folgendes.

  • Überprüfen Sie die .NET CLR-Version. Gibt es in deinem Ziel irgendwelche SPs / KBs, die nicht in deinem Entwickler sind?
  • Versuchen Sie, die Debug-Version der C ++ DLL zu laden. Können Sie es laden? Wenn dies fehlschlägt, würde ich vorschlagen, Ihre App unter WinDBG in Ihrem Ziel zu starten. Sobald die Ausnahme getroffen ist, wird Ihnen eine einfach! Analyze -v viele Informationen geben.
  • Als nächsten Schritt würde ich versuchen, dieses Problem in einer Komponententestumgebung zu reproduzieren . Sind die C # -Proben, die Sie erwähnt haben, für x64 VM erstellt? Falls nicht, versuchen Sie es und versuchen Sie, die resultierende Beispiel-Binärdatei in Ihrem Ziel auszuführen. Ist das Problem reproduzierbar?
kannanmr 29.07.2010 07:41
quelle
0

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.

    
Merlyn Morgan-Graham 31.07.2010 06:43
quelle
0

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

    
Mark Mullin 03.08.2010 23:04
quelle
0

@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)

    
Abhi 11.08.2010 01:52
quelle
0

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.

    
ZXX 12.08.2010 12:33
quelle
-2

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: Ссылка

    
Shady M. Najib 01.08.2010 13:41
quelle

Tags und Links