2009-07-16 6 views
4

Wir haben eine Assembly im gemischten Modus, die sowohl VC++ (mit MFC) als auch C++/CLI-Klassen enthält. Es ist eine MFC-Extension-DLL und wird zur Laufzeit in unsere MFC-Programmdatei geladen, und alles funktioniert gut.Warum sehen wir eine ModulLoadExceptionHandlerException beim Komponententest

Wenn wir kommen, um Einheit in dort die nicht verwalteten Klassen testen von einer anderen C++/CLI Montag sehen wir die folgende Ausnahme jedes Mal versuchen wir eine Instanz (über neu) von einer nicht verwalteten Klasse zu erstellen:

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 scheint ein Fehler beim Laden der Baugruppe durch den Test-Runner (Gallio.Echo in diesem Fall).

Ich habe auch eine kleine C++/CLI-Konsole App erstellt und effektiv die gleiche Sache versucht. Ich kann eine Instanz einer ref-Klasse, die in der Assembly enthalten ist, korrekt erstellen, aber wenn ich versuche, eine nicht gemanagte Klasse neu zu erstellen, bekomme ich dieselbe Ausnahme.

Irgendwelche Ideen?

EDIT

Ich wollte die Konsole App-Code schreiben, der hier brach, aber ich habe es neu kompiliert und es funktioniert jetzt! Hier ist sie:

#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 verwenden, 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.

Die Konsolenanwendung ist eine CLR-Konsolenanwendung, in der sich die Testassembly in einer CLR-Klassenbibliothek befindet. Soweit ich das beurteilen kann, verwenden sie die gleichen Compiler-Optionen. Warum arbeitet man und nicht?

Antwort

1

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

(herausgegeben auf der Basis neuer Informationen)

Intriguing. Ich frage mich, ob es aufgrund eines verwalteten statischen Konstruktors in der DLL im gemischten Modus fehlschlagen könnte? Oder etwas schief geht beim Konstruieren einer globalen nativen Variable?

fand ich erwähnt das gleiche Problem in dieser Ausgabe Connect: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=316549

aber keine Lösung oder die richtige Diagnose, ich habe Angst.

+0

Ja, die Testbaugruppe befindet sich ebenfalls in C++/CLI. Ich bearbeite den Post, um den Testkonsolen-App-Code zu integrieren, der bricht. –

+0

Ein interessanter Link. Vielen Dank. –

+0

Colin, haben Sie globale Konstruktoren in Ihrer DLL? –

Verwandte Themen