0

我的应用程序分为 C#(托管代码)和 c++(非托管代码)两部分。这两个部分经常互相调用,并且通常在它们之间传递字符串。我想知道做到这一点的最佳且无错误的方法。

我把问题分成两部分

  1. 从托管调用非托管代码时,我使用字符串生成器从托管传递到非托管:

    [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. 从非托管到托管,我使用函数指针将 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 回答