在托管代码和非托管代码之间调用

时间:2013-03-04 15:23:35

标签: c# c++ pinvoke unmanaged

我的应用程序分为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. 从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, “<body>%d</body>”, SomeVar);
        SendReceiveMessage(str);
    }
    

1 个答案:

答案 0 :(得分:1)

最好是在两者之间创建一个轻量级C ++ / CLI程序集。这就是/为何为这种语言创建的原因。

此C ++ / CLI层将作为程序集引用无缝集成到您的C#项目中,可以像任何.net资源一样访问,并且C ++ / CLI可以无缝地调用任何本机C ++代码。

我已经停止将C ++直接调用到C#代码中,因为我已经尝试过这种技术。

如果您从未听说过C ++ / CLI,here's a concise tutorial in pdf format