Куда мне положить GC.KeepAlive? - PullRequest
       36

Куда мне положить GC.KeepAlive?

0 голосов
/ 23 октября 2018

Мне нужно зарегистрировать обратный вызов в неуправляемом коде, но похоже, что GC продолжает собирать мои ссылки.Поэтому я добавил GC.KeepAlive(callback_pin);, но это не имеет никакого эффекта.Я не уверен, куда мне положить GC.KeepAlive.

Это код, в котором я регистрирую свой собственный обратный вызов для неуправляемого события, оно вызывается из потока.(Some_Callback и Some_Method являются внешними объектами)

var callback_pin = new Some_Callback(MyManagedCallback);
GC.KeepAlive(callback_pin);
Some_Method(callback_pin);
return true;

А ниже показано, как я импортировал неуправляемый код.Документация, которая пришла с ним, предполагает, что я использую вышеупомянутый код для поддержания обратного вызова, но так как обратный вызов никогда не запускается в моем случае, я не думаю, что это правильный способ сделать это.Какие-нибудь просветления?

[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate void Some_Callback(Int32 line, [MarshalAs(UnmanagedType.LPWStr)] string msg);

[DllImport("SOME_DLL.dll", CharSet = CharSet.Unicode)]
public static extern Int32 Some_Method(MulticastDelegate funcPtr, Int32 mask);

1 Ответ

0 голосов
/ 23 октября 2018

Делегаты автоматически «поддерживаются» (технический термин «укоренен») на время собственных функций, в которых они участвуют в качестве параметров.

Вам нужен только специальный код, чтобы сохранить их живыми, если вызываемая вами нативная функция хранит только указатель, а в какой-то более поздний момент другая функция (или поток) использует сохраненный указатель.Фреймворк мог предположительно собрать к тому времени ваш делегат.

Кроме того, ваша проблема в другом: если делегат был собран мусором, вы получите нарушение прав доступа при его вызове.Если ничего не происходит, ваша нативная функция просто не вызывает ее - отладьте ее!

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