Derivate dieser Frage wurden sicherlich gefragt, aber ich habe noch eine finden, die meinem Fall entspricht.Versuch zu lesen oder zu schreiben, geschützter Speicher Ausnahme tritt ohne Debugging, aber nicht mit Debug
Ich habe eine Bibliothek erstellt, die eine C++ - Bibliothek von Drittanbietern einpackt und an einige interne Systeme liefert. Die erstellte Bibliothek verwendet C++/CLI, um Benutzern den Zugriff über C# zu ermöglichen. Die Bibliothek wird erstellt und kann mit unserem internen NuGet-Server mit kontinuierlicher Integration gestartet werden. Daher ist sie verfügbar.
Es gibt kein Problem mit dieser Bibliothek innerhalb einer anderen Anwendung/System beim Ausführen eines Programms mit "Start Debugging" (F5), aber wenn es mit "Start ohne Debugging" (Strg + F5) oder über eine ausführbare Datei ausgeführt wird Ausnahme wird wie folgt erhöht:
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at TheirLib.func(Int32 , Int32 , Double* , Int32 , Int32* , Int32* , Double* , Int32 , TheirLibError*)
at MyLib.Func(Int32 n, Int32 m, Double[] x, Int32 tdx, Int32[] svar, Int32[] sobs, Double[] corr, Int32 tdc)
at SomeApplication.Program.Main(String[] args) in d:\SomeApplication\SomeApplication\Program.cs:line 67
ich hier (https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception) gelesen, dass es, dass man sein könnte, muss .NET 4.5.2, aber das alles änderte sich nicht. Ich dachte auch, dass es in meiner C++/CLI-Bibliothek einige Einstellungen geben könnte, mit denen ich dieses Problem umgehen könnte, aber ich konnte nichts finden und habe das Gefühl, überall nachgesehen zu haben. Ich habe auch den C++/CLI-Code betrachtet, der die pin_ptr-Objekte vorbereitet, die beim Aufruf der Third-Party-Bibliothek verwendet werden, aber alles sieht gut aus (siehe unten).
void MyLib::Func(int n, int m, array<double>^ x, int tdx, array<int>^ svar, array<int>^ sobs,
array<double>^ corr, int tdc)
{
// Setup input parameters
pin_ptr<double> xPtr = &(x[0]);
pin_ptr<int> svarPtr = &(svar[0]);
pin_ptr<int> sobsPtr = &(sobs[0]);
pin_ptr<double> corrPtr = &(corr[0]);
TheirLibError fail;
// Call their library's function
func(n, m, xPtr, tdx, svarPtr, sobsPtr, corrPtr, tdc, &fail);
}
Auch hier arbeitet die Bibliothek genau wie erwartet mit „Start Debugging“ und übergibt eine erschöpfende Reihe von Tests, aber ich kann einfach nicht verstehen, warum dies nicht allein funktionieren würde ... ich buchstäblich alles versuchen, dies werde zeigen Sie darauf, dass es funktioniert. Hilf mir SO, du bist meine einzige Hoffnung ...
Warum die Downvotes? Wenn etwas in Bezug auf die Fragen/Problem nicht klar ist, oder es irgendwo eine Lösung gibt, würde ich lieber über sie als im Gegensatz zu erhalten nur Downvotes hören ... – grantathon
Ich fürchte, Sie werden nicht viel Hilfe bekommen, der Fehler scheint in der Third-Party-Lib zu sein ... Haben Sie überprüft, ob die Arrays groß genug sind? Ich nehme an, einer der Parameter ist die Anzahl der Elemente. Haben Sie den Wert überprüft? Kann nicht viel mehr dort helfen:/ –
@Lucas: Also vom Blick auf die MyLib :: Func, würdest du sagen, dass dies die pin_ptr Objekte richtig initialisiert? Siehst du etwas inkonsistentes von dem, was du normalerweise siehst? – grantathon