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

时间:2013-12-06 07:53:50

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

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

建议的方法是什么?

3 个答案:

答案 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