0

私のアプリケーションは、C# (マネージ コード) と C++ (アンマネージ コード) の 2 つの部分に分かれています。両方の部分が互いに頻繁に呼び出しを行い、通常はそれらの間で文字列を渡します。それを行うための最良でエラーのない方法を知りたいです。

私は問題を二つの部分に分けた

  1. Managed から Unmanaged コードを呼び出す場合、String Builder を使用して Managed から Unmanaged に渡します。

    [DllImport("SomeXYZ.dll")]
    // enter code here
    
    private void XYZ(string text)
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(“Var1”);
        FromManagedtoUnmanaged(builder);
    }
    

    C++ コード:

    extern "C"
    {
    int _declspec(dllexport) FromManagedtoUnmanaged(char* var1);
    }
    
  2. Unmanaged から Managed まで、関数ポインターを使用して、c# 関数の関数参照を c++ 関数に渡します。

    C# コード

    [DllImport("SomeXYZ.dll")]
    public static extern void SetCallback(Callback fn);
    public delegate void Callback(string text);
    public Callback mInstance;
    
    private void ABC(string text)
    {
        mInstance = new Callback(SomeFunctionName);
        SetCallback(mInstance);
    }
    

    ヘッダー ファイル内の C++ コード:

    extern "C" 
    {
    void __declspec(dllexport) __stdcall SetCallback(Callback handler);
    void __declspec(dllexport) __stdcall SendReceiveMessage(char* arr1); 
    }
    

    そして .cpp ファイルで:

    void __stdcall SetCallback(Callback handler1) {
        Handler = handler1;
    }
    
    void __stdcall SendReceiveMessage(char* arr1) {
        Handler(arr1);
    }
    
    void SendMsg(int SomeVar)
    {
        char *str;
        str = new char[1024];
        sprintf(str, “&lt;body>%d</body>”, SomeVar);
        SendReceiveMessage(str);
    }
    
4

1 に答える 1

1

最適な方法は、両者の間に軽量の C++/CLI アセンブリを作成することです。これは、この言語が作成された目的/理由です。

この C++/CLI レイヤーは、アセンブリ参照として C# プロジェクトにシームレスに統合され、.net リソースと同様にアクセスでき、C++/CLI はネイティブ C++ コードをシームレスに呼び出すことができます。

この手法を試して以来、C++ を C# コードに直接呼び出すのをやめました。

C++/CLI について聞いたことがない場合は、pdf 形式の簡潔なチュートリアルをご覧ください

于 2013-03-04T15:45:45.303 に答える