Создание неуправляемого объекта в C#
Я хочу создать экземпляр неуправляемого класса C++. У меня есть этот интерфейс C++:
// ITestDll.h
#pragma once
class ITestDll {
public:
virtual void PrintHello() = 0;
};
Неуправляемый код DLL:
// TestDll.h
#pragma once
#ifdef TestDll_EXPORTS
#define TestDll_API __declspec(dllexport)
#else
#define TestDll_API __declspec(dllimport)
#endif
#include <string>
#include "ITestDll.h"
class TestDll : public ITestDll {
public:
TestDll();
void PrintHello();
};
extern "C" TestDll_API ITestDll* CreateTestClass() {
return new TestDll();
}
///////////////////////////////////////////////
// TestDLL.cpp
#include "stdafx.h"
#define TestDll_EXPORTS
#include "TestDll.h"
#include <iostream>
TestDll::TestDll() {
//
}
void TestDll::PrintHello() {
std::cout << "Hello, world!" << std::endl;
}
C++ / CLR Wrapper:
// TestCLR.h
#pragma once
#include "ITestDll.h"
namespace Test {
public ref class TestCLR
{
public:
TestCLR();
void PrintHello();
private:
ITestDll* obj;
};
}
/////////////////////////////////////////
// TestCLR.cpp
#include "TestCLRDll.h"
#include <windows.h>
namespace Test {
TestCLR::TestCLR() {
HINSTANCE testDll = LoadLibraryA("testDll.dll");
typedef ITestDll* (*TestDllCtor)();
TestDllCtor ctor = (TestDllCtor) GetProcAddress(testDll, "CreateTestClass");
this->obj = ctor();
}
void TestCLR::PrintHello() {
obj->PrintHello();
}
}
Приложение C#:
using TestCLR;
namespace TestUnmanagedCLR
{
class Program
{
static void Main(string[] args)
{
TestCLR inst = new TestCLR();
inst.PrintHello();
}
}
}
Я включил неуправляемую отладку. Я получаю сообщение об ошибке в оболочке CLR в этой строке: this->obj = ctor(); Ошибка: Помощник по управляемой отладке "FatalExecutionEngineError" обнаружил проблему в "C:...\TestUnmanagedCLR\bin\Debug\TestUnmanagedCLR.exe".
Дополнительная информация: во время выполнения произошла фатальная ошибка. Адрес ошибки был 0x70204cc0 в потоке 0x1ce8. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек.
Любые предложения, почему это происходит? Что я делаю не так? Вызов dll из C++ clr работает хорошо, но из C# это не работает.
ОБНОВЛЕНИЕ: Проблема была в том, что приложение.net не нашло неуправляемую dll, поэтому ее размещение в папке проекта решает проблему. (правила procmon:)