Хранение «управляемого» параметра контекста в неуправляемой DLL - PullRequest
3 голосов
/ 30 ноября 2011

Я не знаю, плохая идея или нет.Я использую неуправляемую DLL (написанную мной) в C #.

Есть некоторые функции обратного вызова, которые можно настроить в DLL, но они могут быть сопоставлены только статическим членам класса на стороне C #.

Поскольку я хочу, чтобы обратный вызов работал наМне хотелось бы знать, будет ли безопасно хранить указатель на экземпляр класса внутри информации о состоянии DLL.

С точки зрения DLL это будет просто 32-битное целое число контекста, но со стороны C # это будет действительный класс "указатель" или "ссылка", причем сигнатура обратного вызова определена примерно так:

public delegate void StatusChangeHandler(ContextClass context, int someCallbackValue);

Он компилируется и, кажется, работает, я просто не знаю, гарантировано ли это.Это приемлемая практика?

1 Ответ

0 голосов
/ 30 ноября 2011

Одна проблема, которую я вижу здесь, состоит в том, что .Net имеет сборщик мусора, который может перемещать ваш класс. Таким образом, ваш сохраненный указатель может быть признан недействительным. Чтобы предотвратить это для простых типов, вы должны закрепить объект следующим образом:

byte[] b = new byte[1000];
// pin b, and get pointer to the first element.
fixed (byte* ptr = &b)
{
   //use your fixed pointer to b. b will not be moved untill code leaves fixed region.
}

Хотя для сложных типов .Net может оказаться достаточно разумным для автоматического закрепления объектов, я бы на это не полагался. Итак, вы должны написать что-то вроде этого:

var ctx = new Context();
fixed (IntPtr ptr = &ctx)
{
    StatusChange(ptr);
    // do other stuff, and don't leave fixed region, until you can clear the pointer in the native library.
}

Но на самом деле, я думаю, что гораздо более простым и надежным способом будет создание статического словаря для ваших контекстных объектов и предоставление вашей нативной dll только ключа для этого словаря, который может быть числом, строкой или GUID. Например. все, что является значением, а не указателем.

...