NullReferenceException bei Aufruf einer dll-Funktion
-
Hallo,
habe ein akutes Problem mit einer managed cpp .net dll:
Wenn die Dll als Release mit Visual Studio 2003 (.NET Framework 1.1.4322 SP1) .Net compiliert ist, gibt es direkt beim Aufruf einer DLL-Funktion aus C# heraus folgende Fehlermeldung: “Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Testumgebung.exe aufgetreten.“
Dieser Fehler tritt direkt beim Aufruf der Funktion auf, es erfolgt offenbar erst gar kein Einsprung in die DLL-Funktion! Ich kann jedoch keinen offensichtlichen Fehler erkennen, vor allem verstehe ich nicht warum offenbar nichtmal in die DLL-Funktion eingesprungen werden kann.
Im Disassembly-Fenster sieht man, dass der Fehler bei der Instruktion
00000014 call dword ptr ds:[002769A8h]
auftritt – wieso geht dieser call offenbar schief?Nachfolgend und anbei die DLL-Funktion incl. C#-Projekt (bereits weitestgehend vereinfacht, sehr übersichtlich, bitte selbst testen!):
void TestClass::Testfunc([Out] TestStruct (&testList) __gc[]) { testList = new TestStruct __gc[5]; for (int i=0; i<5; i++) { if (i>0) { testList[i].curDivTime = testList[i].curDivTime - testList[i-1].curDivTime; } } }
Wichtig: die DLL muss als RELEASE compiliert sein, das C#-Projekt kann als DEBUG oder als RELEASE erstellt sein.
Code siehe http://www.mycsharp.de/wbb2/thread.php?threadid=70184
-
Hmm... ich habe schon sehr lange nichts mehr mit dem alten managed C++ gemacht, und gedenke aus gutem Grunde, nichts daran zu ändern. Warum wird nicht auf das neue C++/CLI umgestiegen? Anyway, ich glaube mich daran zu erinnern, dass die alte Syntax für einen solchen Array-Parameter anders aussieht, als in dem Code, welchen du uns gegeben hast. Müsste es nicht
void TestClass::Testfunc([Out] TestStruct (__gc *testList) __gc[])
heissen? Deine Variante kompiliert doch zu etwas, was in C# nicht einmal dargestellt werden kann (Wenn ich mich korrekt erinnern kann, entspricht dieser Parameter einem nativen Zeiger mit
modopt(IsImplicitlyDereferenced)
auf einen verwalteten Zeiger auf einen[Out]
Array vonTestStruct
s - oder so ähnlich. Jedenfalls gibts doch sowas in C# bestimmt nicht. Denn wer will sich schon mit sowas rumschlagen? ;)). Zwar sollte der Compiler nun warnen, wenn du eine solche Funktion aufrufst, doch wenn er es nicht tut, dann ist es vernünftig, anzunehmen, dass die Argumente nicht so in der Funktion ankommen, wie du sie aus C# übergibst. Eventuell geht darum alles in die Luft, wenn du dann auf den Array zugreifen willst. Aber das ist nur meine Verschwörungstheorie des Tages
-
Hallo /rant/,
habe Deinen Tip ausprobiert statt der Referenz den __gc * zu verwenden, ist vom Verhalten her leider gleich geblieben.
Was mich generell wundert:
- wenn der Code mit der Differenzbildung in der DLL nicht enthalten ist, kann ich (trotz Release-Build) durch die DLL-Funktion durchsteppen
- wenn der Code mit der Differenzbildung in der DLL enthalten ist, springt der Debugger schon gar nicht in die Funktion ein sondern wenn der Einzelschritt zum Springen in die Funktion ausgelöst wird kommt es direkt zu der ExceptionHat jemand eine Idee wie das evtl. weiter / besser zu Debuggen ist? Ich verstehe überhaupt nicht, was hier genau schief geht? Wo wird NULL referenziert?
-
Hallo Christian,
ich weiß, dass der Debugger von Visual Studio rockt und ich würde auf ihn auch nicht mehr verzichten wollen. Aber hast Du schon mal daran gedacht Debug-Ausgaben ala Console.WriteLine zu nehmen?
Viel Glück