У меня есть неуправляемый dll с классом "MyClass" в нем. Теперь есть ли способ создать экземпляр этого класса в коде C#? Вызвать его конструктора? Я попробовал, но Visual Studio сообщает об ошибке с сообщением, что эта область памяти повреждается или что-то.
Заранее спасибо
C # не может создать экземпляр класса, экспортированный из собственной библиотеки Dll. У вас есть два варианта:
Создать оболочку C ++ / CLI. Это библиотека классов .NET, которую можно добавить в качестве ссылки в любой другой проект .NET.Внутренне класс C ++ / CLI работает с неуправляемым классом, связываясь с собственной Dll по стандартным правилам C ++. Для клиента .NET этот класс C ++ / CLI выглядит как класс .NET.
Напишите оболочку 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.
Нельзя использовать несвязанный код 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
}