Я использую делегат, который вызывает указатель неуправляемой функции. Это приводит к тому, что сборщик мусора собирает его перед использованием, как описано на странице CallbackOnCollectedDelegate MDA в MSDN: Страница MSDN для CallbackOnCollectedDelegate MDA .
В решении указано, что я должен маршалировать соответствующий делегат как указатель на неуправляемую функцию. Первым моим рефлексом было использовать:
[MarshalAs(UnmanagedType.FunctionPtr)]
public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity);
Однако компилятор C # не позволяет мне упорядочивать делегата, даже если это решение, предложенное MSDN. Более того, на странице MSDN показан только пример возникшей проблемы, но не одно из ее решений.
Как я могу упорядочить своего делегата как указатель на неуправляемую функцию или предотвратить его сборку мусора?
РЕДАКТИРОВАТЬ : Как предлагается, Я создал ссылку на обратный вызов. Поэтому мой код изменился с / на:
// From:
foo.SetCallback(new EntityCallback(bar));
// To:
call = new EntityCallback(bar); // Referenced in class
foo.SetCallback(call);
Теперь это работает - но только в режиме отладки. Когда я переключаюсь на Release, происходит сбой в той же точке. Почему?
РЕДАКТИРОВАТЬ 2 : Более полный фрагмент кода:
public class Test
{
private EntityCallback Call;
private void Bar(System.IntPtr target)
{
...
}
public Entity Foo { get; set; }
public Test()
{
this.Foo = new Body.Sphere() { Visible = false }; // Irrelevant
this.Foo.CollisionType = 3; // Irrelevant
this.Call = new EntityCallback(this.Bar);
this.Foo.SetCallback(this.Call, EntityCallbackType.Collision);
}
}