0

文字列を返すc#からc++コールバック関数を呼び出す必要があります。以下のコードを試してみると、アプリケーションが激しくクラッシュします(ヒープの破損が原因である可能性があるというメッセージが表示されます)。

これがc++コードです:

static String^ CppFunctionThatReturnsString()
{
    return gcnew String("From C++");
}

void main()
{
    CSharp::CSharpFunction(IntPtr(CppFunctionThatReturnsString));
}

そしてここにc#コードがあります:

public class CSharp
{
    private delegate string CppFuncDelegate();

    public static void CSharpFunction(IntPtr cppFunc)
    {
        var func = (CppFuncDelegate)Marshal.GetDelegateForFunctionPointer(cppFunc, typeof(CppFuncDelegate));
        func(); // Crash
    }
}

文字列を返す前に、文字列を使って何らかのマーシャリングの魔法をかける必要がありますか?

4

2 に答える 2

1

そもそもなぜ関数ポインタを使っているのですか?デリゲートのインスタンスをC#コードに渡すだけです。

C ++:

static String^ CppFunctionThatReturnsString()
{
    return gcnew String("From C++");
}

void main()
{
    CSharp::CSharpFunction(new CSharp::CppFuncDelegate(CppFuncThatReturnsString));
}

C#:

public class CSharp
{
    private delegate string CppFuncDelegate();

    public static void CSharpFunction(CppFuncDelegate d)
    {
        d();
    }
}

クラス内にCppFuncThatReturnsStringを配置する必要があると思います。

于 2012-10-26T16:12:40.727 に答える
0

この10年前のページで答えを見つけました。

c ++:

static const char* __stdcall CppFunctionThatReturnsString()
{
    return "From C++";
}

void main()
{
    CSharp::CSharpFunction(IntPtr(CppFunctionThatReturnsString));
}

c#:

public class CSharp
{
    private delegate IntPtr CppFuncDelegate();

    public static void CSharpFunction(IntPtr cppFunc)
    {
        var func = (CppFuncDelegate)Marshal.GetDelegateForFunctionPointer(cppFunc, typeof(CppFuncDelegate));
        Marshal.PtrToStringAnsi(func());
    }
}

つまり、それをIntPtrとして渡し、C#側で文字列にマーシャリングします。

于 2012-10-26T13:42:38.277 に答える