从 C++/CLI 调用 C# dll 函数

Posted

技术标签:

【中文标题】从 C++/CLI 调用 C# dll 函数【英文标题】:Call C# dll function from C++/CLI 【发布时间】:2011-06-16 15:08:21 【问题描述】:

我有一个C# dll。代码如下:

public class Calculate

    public static  int GetResult(int arg1, int arg2)
    
        return arg1 + arg2;
    

    public static  string GetResult(string arg1, string arg2)
    
        return arg1 + " " + arg2;
    

    public static   float GetResult(float arg1, float arg2)
    
        return arg1 + arg2;
    

    public Calculate()
    
    

现在,我打算以这种方式从C++ 调用这个dll。

[DllImport("CalculationC.dll",EntryPoint="Calculate", CallingConvention=CallingConvention::ThisCall)]
extern void Calculate();

[DllImport("CalculationC.dll",EntryPoint="GetResult", CallingConvention=CallingConvention::ThisCall)]
extern int GetResult(int arg1, int arg2);

这里是调用GetResult的函数

private: System::Void CalculateResult(int arg1, int arg2)

    int rez=0;

    //Call C++ function from dll
    Calculate calculate=new Calculate();
    rez=GetResult(arg1,arg2);

我收到错误消息:“语法错误:标识符‘计算’”。 有人可以帮我解决这个可怕的错误吗?

【问题讨论】:

如果您使用的是 c++ CLI,为什么不直接引用 c# 程序集呢? DllImport 旨在允许您从托管代码中调用非托管 dll。 我对 Visual Studio C++ 有点困惑。您能否建议我如何在 VS2010 C++ 项目中正确添加对我的 dll 的引用。我尝试使用 Assembly.LoadFile 没有任何成功。 您好像忘记接受答案了 【参考方案1】:

您必须使用 c++ CLI,否则您无法调用 DllImport。 如果是这种情况,您可以只引用 c# dll。

在 c++ CLI 中,您可以执行以下操作:

using namespace Your::Namespace::Here;

#using <YourDll.dll>

YourManagedClass^ pInstance = gcnew YourManagedClass();

其中“YourManagedClass”在 c# 项目中定义,输出程序集“YourDll.dll”。

** 编辑 ** 添加了您的示例。

这就是您的示例在 CLI 中的外观(为了清楚起见,我假设 G etResult 不是静态函数,否则您只需调用 Calculate::GetResult(...)

private: System::Void CalculateResult(int arg1, int arg2)

    int rez=0;
    //Call C++ function from dll
    Calculate^ calculate= gcnew Calculate();
    rez=calculate->GetResult(arg1,arg2);   

【讨论】:

非常感谢您的帮助和方便。 很高兴它有帮助。如果它解决了您的问题,请不要忘记将回复标记为答案 ;-) 谢谢! 观看您的框架版本!只是对此有一个很大的说明。一些 Visual C++ 项目希望默认使用 .NET 4,而您的 DLL 可能会默认使用 .NET 4.5,当您尝试运行类似代码时,它可能会抱怨“找不到文件”之类的混淆错误。那么,您需要卸载您的 Visual C++ 项目,然后编辑项目文件的 XML 标记以强制它针对 .NET 4.5 进行编译。然后它将起作用。花了一个小时在这个问题上挠头……哈哈 :) 将 C# 开发的库引用到 C++/CLI 项目是否有任何性能缺陷?我正在开发一个应该在 C# 和 C++/CLI 项目中使用的类库。我应该在非托管代码中单独编写 C++/CLI 版本吗?

以上是关于从 C++/CLI 调用 C# dll 函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 C++ dll 方法/类

非托管C++通过C++/CLI包装调用C# DLL

从 C# 调用 C++ dll 函数时出现问题

MFC dll 中的访问冲突(用 C++/CLI 包装)从 C# 程序开始

使用非托管 C++ .dll 从 C# .exe 调用函数

如何通过 C# 从 C++ dll 调用 struct 中的函数