c# - 托管代码和非托管代码之间的调用

标签 c# c++ pinvoke unmanaged

<分区>

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

我把问题分为两部分

  1. 从托管代码调用非托管代码时,我使用 String Builder 从托管代码传递到非托管代码:

    [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, “<body>%d</body>”, SomeVar);
        SendReceiveMessage(str);
    }
    

最佳答案

最好是在两者之间创建一个轻型 C++/CLI 程序集。这就是为什么/为什么要创建这种语言。

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

自从我尝试了这种技术后,我就不再将 C++ 直接调用到 C# 代码中了。

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

关于c# - 托管代码和非托管代码之间的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204949/

相关文章:

c++ - 如何限制 C++ 中用户输入的最大字符数?

c# - 如何用TWAIN获取扫描仪的序列号?

c# - 相当于 WinRT Metro 中的 'KeyPreview' 属性

c# - 如何使用 DotNetZip 即时提取 ZIP 文件?

c++ - c++11 中首选的初始化方式

c++ - 配置 Visual Studio 以使用 Boost.Python 和 Python 3

c# - 委托(delegate)从引用的 C++ DLL 触发 C# 函数

c# - 如何正确处理 pinvoke/非托管代码

c# - WPF 无法设置组合框的选定项

c# - 如何在 ApplicationUserManager 上使用 Identity 2.2 并且不使用 ILookupNormalizer