Создать неуправляемый объект C ++ в C # - PullRequest
12 голосов
/ 14 апреля 2010

У меня есть неуправляемая dll с классом "MyClass". Есть ли способ создать экземпляр этого класса в коде C #? Называть его конструктором? Я пытался, но Visual Studio сообщает об ошибке с сообщением, что эта область памяти повреждена или что-то.

Заранее спасибо

Ответы [ 3 ]

21 голосов
/ 14 апреля 2010

C # не может создать экземпляр класса, экспортированный из нативной Dll. У вас есть два варианта:

  1. Создание оболочки C ++ / CLI. Это библиотека классов .NET, которую можно добавить как ссылку на любой другой проект .NET. Внутри класс C ++ / CLI работает с неуправляемым классом, связываясь с собственным Dll по стандартным правилам C ++. Для клиента .NET этот класс C ++ / CLI выглядит как класс .NET.

  2. Напишите оболочку C для класса C ++, которую может использовать клиент .NET с PInvoke. Например, упрощенный класс C ++:


    class MyClass()
    {
    public:
        MyClass(int n){data=n;}
        ~MyClass(){}
        int GetData(){return data;}
    private:
        int data;
    };

C API-оболочка для этого класса:


    void* CreateInstance()
    {
        MyClass* p = new MyClass();
        return p;
    }

    void ReleaseInstance(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        delete p;
    }

    int GetData(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        return p->GetData();
    }

    // Write wrapper function for every MyClass public method.
    // First parameter of every wrapper function should be class instance.

CreateInstance, ReleaseInstance и GetData могут быть объявлены в клиенте C # с помощью PInvoke и вызваны напрямую. Параметр void * должен быть объявлен как IntPtr в объявлении PInvoke.

3 голосов
/ 07 декабря 2016

Решение - создать оболочку C ++ / CLI, например:

#include "DllExportClass.h"

public ref class ManagedOperationHelper
{
    public:

    double Sum(double add1, double add2)
    {
        CDllExportClass obj;
        double ret=obj.Sum(add1, add2);
        return ret;
    }

    double Mult(double mult1, double mult2)
    {
        CDllExportClass obj;
        double ret=obj.Mult(mult1, mult2);
        return ret;
    }
};

где CDllExportClass - это класс, экспортируемый из собственного кода. Выше .h C ++ / CLI. Позаботьтесь, чтобы найти библиотеку для этой библиотеки. Поместите dll и lib в один и тот же каталог и скомпилируйте код C ++ / CLI. В каталог управляемого кода поместите нативный dll и dll C ++ / CLI. В управляемом проекте поместите ссылку на проект C ++ / CLI. Внедрить в maged-код класс C ++ / CLI, например:

ManagedOperationHelper obj = new ManagedOperationHelper();
double ret=obj.Sum(10, 20);  

Это все.

2 голосов
/ 14 апреля 2010

Вы не можете использовать неуправляемый код C ++ непосредственно в C #. Взаимодействие может быть сделано с помощью PInvoke. Есть много вопросов, связанных с этой темой , особенно при вызове функций, у которых указатели являются аргументами.

Основная процедура выглядит следующим образом:

C # часть

namespace MyNamespace {
  public class Test {
    [DllImport("TheNameOfThe.dll")]
    public static extern void CreateMyClassInstance();

    public void CallIt() {
        CreateMyClassInstance(); // calls the unmanged function via PInvoke
    }
  }
}

C ++ часть

class MyClass {
  public: MyClass() { /** Constructor */ }
};

MyClass* staticObject;

extern "C" void CreateMyObjectInstance() {
   staticObject = new MyClass(); // constructor is called
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...