从 C++ 调用 C# dll(MSVC 编译器)

Posted

技术标签:

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

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

推荐的做法是什么?

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于从 C++ 调用 C# dll(MSVC 编译器)的主要内容,如果未能解决你的问题,请参考以下文章

C++ MSVC dll 编译错误缺少类型说明符和重新定义

从 MinGW 调用 MSVC DLL 函数

让非托管 c++ 代码调用调用 c# 代码的托管 c++ 代码

C++ 从指针构造

从 C# 获取非托管 C++ 函数

如何使用 system() 函数 (MSVC) 编译 c++ 代码?