Я создаю оболочку .NET вокруг библиотеки C ++ (у меня нет доступа к источнику), используя C ++ / CLI.Библиотека C ++ должна вызывать делегат .NET, написанный на C ++ / CLI.Я назначаю функцию обратного вызова для классов библиотеки C ++, используя Marshal :: GetFunctionPointerForDelegate.Однако когда эта функция вызывается обратно с неуправляемой стороны, я должен убедиться, что функция делегата .NET все еще находится в той же области памяти.
Самым простым способом, конечно, является требование.Пользователь библиотеки NET прикрепляет объект .NET, но это не совсем чистый дизайн, а также позволяет пользователю выстрелить себе в ногу.Лучший способ - спроектировать класс .NET таким образом, чтобы он закреплялся сам во время создания или запускался функцией / событием.
Как бы я это спроектировал?Согласно этой ссылке, http://msdn.microsoft.com/en-us/library/18xa23yk%28v=VS.100%29.aspx, вы не можете иметь внутренние ~ = закрепленные указатели в качестве членов объекта.Это означает, что можно создать закрепленную ссылку на указатель в виде статической или глобальной переменной.
Так что я хочу сделать что-то подобное любому из этих двух, но не могу заставить его скомпилировать / работать.
public ref class UserClass{
void createDotNetCPPWrapperClass()
{
m_class = gcnew DotNetCPPWrapperClass;
}
DotNetCPPWrapperClass^ m_class
};
public ref class DotNetCPPWrapperClass{
static pin_ptr<DotNetCPPWrapperClass^> pinnedSelf;
DotNetCPPWrapperClass()
{
pinnedSelf = this;
}
};
ИЛИ
public ref class UserClass{
void createDotNetCPPWrapperClass()
{
m_class = gcnew DotNetCPPWrapperClass;
m_class->setupImportantStuff();
}
DotNetCPPWrapperClass^ m_class
};
public ref class DotNetCPPWrapperClass{
static pin_ptr<DotNetCPPWrapperClass^> pinnedSelf;
DotNetCPPWrapperClass(){}
void setupImportantStuff()
{
pinnedSelf = this;
}
};