Как использовать экземпляр класса C ++ в C # - PullRequest
3 голосов
/ 20 августа 2011

У меня есть DLL, которая содержит класс, который наследуется от другого абстрактного класса C ++, определенного следующим образом:

class PersonInterface
{
public:
    virtual int __stdcall GetName() = 0;
};

DLL экспортирует функцию, которую можно использовать в C # следующим образом (следующий метод является частью статического класса PersonManager):

[DllImport( "person.dll", CallingConvention = CallingConvention.Cdecl )]
public static extern bool GetPerson( out PersonInterface person  );

где PersonInterface определяется в классе C # следующим образом:

[StructLayout( LayoutKind.Sequential )]
public class PersonInterface
{
}

Я могу успешно получить экземпляр класса C ++ следующим образом:

PersonInterface person;
bool retrieved = PersonManager.GetPerson( out person );

Однако извлеченный объект бесполезен, пока не будет вызван метод GetName.

Что еще нужно сделать, чтобы можно было вызывать метод GetName для извлеченного объекта person?

string name = person.GetName();

Ответы [ 2 ]

4 голосов
/ 20 августа 2011
  • Скомпилируйте свою C ++ DLL с помощью опции компилятора /clr.
  • Запишите управляемый класс, используя синтаксис public ref class, и указатель на свой собственный класс в этом классе. Предоставьте все методы из этого управляемого класса и forward все вызовы для вашего собственного класса.
  • Импортируйте эту DLL как сборку в ваш проект на c # и используйте этот класс, как если бы вы использовали любой другой класс .NET.

Вам нужно скомпилировать только несколько исходных файлов с использованием флага /clr, но не все. Пусть все исходные файлы будут скомпилированы как собственные. Ваша DLL будет связана с DLL времени выполнения VC, а также DLL времени выполнения .NET.

Существует много возможностей для управляемого класса, /clr, Взаимодействие / Маршаллинг, но, по крайней мере, начать.

Вы можете выбрать свои любимые статьи из здесь

2 голосов
/ 20 августа 2011

Вам нужно написать оболочку на C ++ (это может быть C ++), где вы будете называть себя C ++ clasess и предоставлять либо функции flat dll, которые можно вызывать из классов .Net, либо .Net (если вы использовалиуправляемый C ++), который будет доступен из .Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...