Вы можете создать управляемую DLL взаимодействия C ++, которая будет действовать как оболочка для библиотеки C #.
Большинство учебников по управляемому C ++, к сожалению, только объясняют, как обернуть неуправляемый C ++ для использования в C #. Но это может работать и по-другому.
Определите абстрактный интерфейсный класс в своем родном коде C ++, затем создайте конкретный подкласс в управляемой C ++ DLL. Вызовите ваши объекты C # в реализациях методов.
Наконец, экспортируйте фабричную функцию, которая будет создавать экземпляр класса реализации и возвращать указатель базового класса, который может использовать ваш собственный код.
Вот краткий пример:
Сначала определите интерфейс класса в своей собственной DLL.
interopclassbase.h
class InteropClassBase
{
public:
virtual void doStuff() = 0;
virtual int getValue() = 0;
virtual void getString(CString* outStr) = 0;
};
Теперь вам нужно создать C ++ / CLI DLL, которая позволит вам смешивать собственный и управляемый код в одной сборке. Добавьте новый проект C ++ в свое решение, и в конфигурации проекта установите «Поддержка поддержки общего языка» *1019* на Смешанный (/ clr).
Как только вы добавите ссылку на вашу библиотеку C # (которую мы будем называть ManagedLibrary), мы можем реализовать класс взаимодействия:
interopclass.cpp
#include "interopclassbase.h"
#include <vcclr.h>
public class InteropClass : public InteropClassBase
{
protected:
gcroot<ManagedLibrary::ManagedObject^> m_managedObject;
public:
InteropClass()
{
m_managedObject = gcnew ManagedLibrary::ManagedObject();
}
virtual void doStuff()
{
m_managedObject->doStuff();
}
virtual int getValue()
{
return m_managedObject->getValue();
}
virtual void getString(CString* pOutStr)
{
System::String^ managedString = m_managedObject->getString();
CString nativeString(managedString); // overloaded CString constructor
if (pOutStr) *pOutStr = nativeString;
}
};
__declspec(dllexport) InteropClassBase* getImplementationPointer()
{
return new InteropClass();
}
Теперь вам просто нужно загрузить DLL взаимодействия из вашего собственного проекта и вызвать экспортированную функцию.