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?