4 Stimmen

Warum sehen wir eine ModuleLoadExceptionHandlerException beim Unit-Test

Wir haben eine Mixed-Mode-Assembly, die sowohl VC++ (mit MFC) als auch C++/CLI-Klassen enthält. Es handelt sich um eine MFC-Erweiterungs-DLL, die zur Laufzeit in unsere ausführbare MFC-Datei geladen wird, und alles funktioniert gut.

Wenn wir die nicht verwalteten Klassen dort von einer anderen C++/CLI-Assembly aus testen wollen, sehen wir jedes Mal, wenn wir versuchen, eine Instanz (über new) einer nicht verwalteten Klasse zu erstellen, die folgende Ausnahme:

Exception
System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> <CrtImplementationDetails>.ModuleLoadExceptionHandlerException: A nested exception occurred after the primary exception that caused the C++ module to fail to load.
 ---> System.Runtime.Serialization.SerializationException: Serialization error.
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at <CrtImplementationDetails>.DoCallBackInDefaultDomain(IntPtr function, Void* cookie)
   at <CrtImplementationDetails>.DoCallBackInDefaultDomain(IntPtr , Void* )
   at <CrtImplementationDetails>.LanguageSupport.InitializeDefaultAppDomain(LanguageSupport* ) in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 518
   at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* ) in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 721
   at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* ) in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 875
   --- End of inner exception stack trace ---
   at <CrtImplementationDetails>.ThrowNestedModuleLoadException(Exception innerException, Exception nestedException)
   at <CrtImplementationDetails>.ThrowNestedModuleLoadException(Exception , Exception )
   at <CrtImplementationDetails>.LanguageSupport.Cleanup(LanguageSupport* , Exception innerException) in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 841
   at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* ) in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 883
   at .cctor() in f:\dd\vctools\crt_bld\self_x86\crt\src\mstartup.cpp:line 922
   --- End of inner exception stack trace ---
   at MSMContactDataTests.LoadUnknownItemTest()

Dies sieht nach einem Fehler beim Laden der Baugruppe durch das Testlaufprogramm (in diesem Fall Gallio.Echo) aus.

Ich habe auch eine kleine C++/CLI-Konsolenanwendung erstellt und praktisch das Gleiche versucht. Ich kann eine Instanz einer in der Assembly enthaltenen Ref-Klasse korrekt erstellen, aber wenn ich versuche, eine unveränderte Klasse neu zu erstellen, erhalte ich die gleiche Ausnahme.

Irgendwelche Ideen?

EDITAR

Ich wollte den Code der Konsolenanwendung, der nicht funktionierte, hier posten, aber ich habe ihn neu kompiliert und er funktioniert jetzt! Hier ist er:

#include "stdafx.h"

using namespace System;

#include "SCacheAssignment.h"

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    SCacheAssignment* assignment = new SCacheAssignment(NULL, false);
    assignment->id = 2;
    Console::WriteLine(L"Hello World 2 " + assignment->id);
    return 0;
}

Wenn ich seinen Code verwende, ist ein Unit-Test:

#include "stdafx.h"

#include "PBSMSDataStoreUnitTests2.h"
#include "SCacheAssignment.h"

using namespace PBSMSDataStoreUnitTests2;

void Class1::SomeTest()
{
    Console::WriteLine(L"Hello World");
    SCacheAssignment* assignment = new SCacheAssignment(NULL, false);
    assignment->id = 2;
    Console::WriteLine(L"Hello World 2 " + assignment->id);
}

Es bricht. Dies ist der einzige Test in der Testanordnung.

Bei der Konsolenanwendung handelt es sich um eine CLR-Konsolenanwendung, bei der die Testbaugruppe in einer CLR-Klassenbibliothek enthalten ist. Soweit ich das beurteilen kann, verwenden sie die gleichen Compiler-Optionen. Warum funktioniert das eine und das andere nicht?

1voto

Kim Gräsman Punkte 7268

Ist Ihre Unit-Test-Assembly auch C++/CLI?

(bearbeitet aufgrund neuer Informationen)

Faszinierend. Ich frage mich, ob es daran liegen könnte, dass ein verwalteter statischer Konstruktor in der Mixed-Mode-DLL fehlschlägt? Oder ist bei der Konstruktion einer globalen nativen Variablen etwas schief gelaufen?

Ich habe in dieser Connect-Ausgabe einen Hinweis auf das gleiche Problem gefunden: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=316549

aber keine Lösung oder richtige Diagnose, fürchte ich.

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