Мне нужно зарегистрировать обратный вызов в неуправляемом коде, но похоже, что 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);