我有一个C#dll,我需要从我的C ++程序(本机C ++,而不是C ++ / CLI)调用它的一些函数。
建议的方法是什么?
答案 0 :(得分:3)
另一种方式(我相信由Matten链接的文章中概述)是在C ++ / CLI中编写包装器。
您使用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的编译器。
答案 1 :(得分:2)
这样做的一种方法是创建C#COM服务器,然后从C ++ COM客户端调用它的函数,如MSDN的COM Interop tutorial中所述。
答案 2 :(得分:2)
另一种方法是在非托管流程中托管CLR,the linked article with examples中概述了一个示例。这是我们喜欢的解决方案,因为我们不需要COM互操作。另一个例子是this MSDN page。