从 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++ 调用 C DLL 会导致访问冲突,但 C# 项目与 DllImport 工作