在C#中创建非托管对象

时间:2017-03-04 19:23:48

标签: c# c++ .net dll c++-cli

我想创建一个非托管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:)

0 个答案:

没有答案