У меня есть старое приложение, которое принимает плагины dll.Каждый плагин имеет функцию, которая создает новый экземпляр «виджета».Эта функция идентифицирует новый экземпляр "виджета", возвращая уникальный int .В шаблоне плагина c ++ я сделал это, объявив новый виджет struct и вернув его указатель в виде уникального идентификатора int (не моя идея, но я должен работать сэто):
struct widget {
...
};
int widget_instance (HWND hwnd) {
widget* myWidget = new widget;
...
return (int) myWidget;
}
Я работаю над плагином ac # для этого приложения, и мне нужно скопировать этот механизм в c #.Как объявить структуру внутри функции, чтобы при каждом вызове функции она возвращала фиксированный неизменяемый указатель на вновь объявленную структуру?Мой код пока:
public struct Widget {
...
}
public static int widget_instance(uint hwnd) {
Widget w = new Widget();
...
IntPtr myWidget = Marshal.AllocCoTaskMem(Marshal.SizeOf(w));
Marshal.StructureToPtr(w, myWidget, false);
return (int) myWidget;
}
Кажется ли это правильным?Нужно ли мне «закрепить» структуру, чтобы это работало так, как это делает с ++?
РЕДАКТИРОВАТЬ: Чтобы уточнить: уникальный идентификатор - это не просто «cookie» int , это фактическипозже используется в шаблоне c ++ для доступа к экземпляру struct путем приведения идентификатора в качестве указателя:
widget* w = (widget*) WidgetID;
w->firstElement = 123;
Я предполагаю, что эквивалент c # будет:
widget w = (widget)Marshal.PtrToStructure((IntPtr)widgetID,typeof(widget));
w.firstElement = 123;