2

C コードからアンマネージ関数を呼び出すためにこれを作成しました。pCallback は関数ポインタであるため、マネージ側はデリゲートです。

[DllImport("MyDLL.dll")]

public static extern Result SetCallback(
            IntPtr handle,
            Delegate pCallback,
            CallbackType Type);

今、私は設定しています

    public delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData);

    public Form1()
    {
        pfnCallback cb = new pfnCallback(cback);
        (...)
        Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT);
        (...)
        }

「...デリゲートをアンマネージコードに渡すときは、それらを維持する必要があります...」というエラーが表示されます

誰でも私を助けることができますか?

よろしく

4

4 に答える 4

3

私がメッセージを理解している限り、次のようにする必要があります。

public delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData);

public pfnCallback cb = new pfnCallback(cback);

public Form1()
{
    (...)
    Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT);
    (...)
}
于 2010-02-17T12:34:27.777 に答える
3

cb のスコープを拡張して、その変数が引き続き存在し、アンマネージ コードがコールバック関数を呼び出す可能性がある限りコールバック関数を参照できるようにする必要があると思います。アンマネージ コードは .NET 参照追跡に参加しないため、コールバックへの参照を強制的に .NET コードに保持しないと、フレームワークによって解放され、アンマネージ コードは後でそれを適切に呼び出すことができなくなります。それ。

于 2010-02-17T12:36:12.687 に答える
0

コールバック変数cbをグローバルに試す

于 2010-02-17T12:38:43.990 に答える