我想创建一个非托管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-&gt; obj = ctor(); 错误是: 托管调试助手'FatalExecutionEngineError'在'C:... \ TestUnmanagedCLR \ bin \ Debug \ TestUnmanagedCLR.exe'中检测到问题。
其他信息:运行时遇到致命错误。错误的地址位于0x70204cc0,位于线程0x1ce8上。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。
有任何建议,为什么会这样?我做错了什么?从c ++ clr调用dll效果很好,但是从c#开始这不起作用。
更新: 问题是.net应用程序没有找到非托管的dll,因此将其放入项目的文件夹可以解决问题。 (procmon rules:)