Создайте неуправляемый объект C++ в c#

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

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

12
задан Evgeny007 14 April 2010 в 11:34
поделиться

2 ответа

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.

21
ответ дан 2 December 2019 в 05:53
поделиться

Нельзя использовать несвязанный код 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
} 
2
ответ дан 2 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: