Определение делегата как указателя функции

Я использую делегат, который вызывает указатель неуправляемой функции. Это приводит к тому, что сборщик мусора собирает его перед использованием, как описано на странице 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);
    }
}

5
задан Lazlo 11 September 2010 в 18:46
поделиться