【问题标题】:Call a C# dll from C++ (MSVC compiler)从 C++ 调用 C# dll(MSVC 编译器)
【发布时间】:2013-12-06 07:53:49
【问题描述】:

我有一个 C# dll,我需要从我的 C++ 程序(本机 C++,而不是 C++/CLI)中调用它的一些函数。

推荐的做法是什么?

【问题讨论】:

    标签: c# c++ .net visual-studio dll


    【解决方案1】:

    另一种方法(我相信在 Matten 链接的文章中也有概述)是在 C++/CLI 中编写包装 dll。

    您编写了一个带有 DLL 导出的常规 C++ 类:

    #pragma once
    
    #ifdef CSCLIWRAPPER_EXPORTS
    #define DLLAPI __declspec(dllexport)
    #else 
    #define DLLAPI __declspec(dllimport)
    #endif
    
    class DLLAPI CsCliWrapper
    {
    private:
        void *wrap;
    
    public:
        CsCliWrapper();
        virtual ~CsCliWrapper();
    };
    

    在项目中引用托管的dll,并在实现中使用:

    #include "CsCliWrapper.h"
    using namespace System;
    using namespace System::Runtime::InteropServices;
    
    CsCliWrapper::CsCliWrapper()
    {
        CsPlugin^ obj = gcnew CsPlugin();
    
        wrap = GCHandle::ToIntPtr(GCHandle::Alloc(obj)).ToPointer();
    }
    
    CsCliWrapper::~CsCliWrapper()
    {
        GCHandle h = GCHandle::FromIntPtr(IntPtr(wrap));
        h.Free();
    }
    

    但是请注意,这种方法不可移植,目前在 linux 或 OSX 上没有支持 C++/CLI 的编译器。

    【讨论】:

    • 不确定接受哪个答案,因为都是可行的解决方案。您能否提及其他 2 个解决方案,所以您的答案是完整的,我会接受吗?
    【解决方案2】:

    一种方法是创建 C# COM 服务器,然后从 C++ COM 客户端调用它的函数,如 MSDN 的 COM Interop tutorial 中所述。

    【讨论】:

      【解决方案3】:

      另一种方法是在非托管进程中托管 CLR,the linked article with examples 中概述了一个示例。这是我们更喜欢的解决方案,因为我们不需要 COM 互操作。另一个例子是this MSDN page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-17
        • 2023-03-07
        • 2021-11-17
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多