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?
Ja, die Testbaugruppe befindet sich ebenfalls in C++/CLI. Ich bearbeite den Post, um den Testkonsolen-App-Code zu integrieren, der bricht. –
Ein interessanter Link. Vielen Dank. –
Colin, haben Sie globale Konstruktoren in Ihrer DLL? –