У нас есть сборка смешанного режима, которая содержит классы VC ++ (с использованием MFC) и C ++ / CLI. Это dll-расширение MFC, которое загружается в наш исполняемый файл MFC во время выполнения и все работает хорошо.
Когда мы приходим к юнит-тестированию неуправляемых классов из другой сборки C ++ / CLI, мы видим следующее исключение каждый раз, когда пытаемся создать экземпляр (через новый) неуправляемого класса:
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()
Это похоже на ошибку при загрузке сборки тестовым прогоном (в данном случае Gallio.Echo).
Я также создал небольшое консольное приложение C ++ / CLI и попробовал эффективно то же самое. Я могу правильно создать экземпляр класса ref, содержащийся в сборке, но когда я пытаюсь создать новый класс без изменений, я получаю то же исключение.
Есть идеи?
РЕДАКТИРОВАТЬ
Я собирался опубликовать код консольного приложения, который сломался здесь, но я перекомпилировал его, и теперь он работает! Вот оно:
#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;
}
Когда я использую его код, это юнит-тест:
#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);
}
Это ломается. Это единственный тест в тестовой сборке.
Консольное приложение представляет собой консольное приложение CLR, где тестовая сборка выполняется в библиотеке классов CLR. Насколько я могу судить, они используют одинаковые параметры компилятора. Почему один работает, а другой нет?