Создание неуправляемого объекта в 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:)

0 ответов

Другие вопросы по тегам