【问题标题】:Call C# dll function from C++/CLI从 C++/CLI 调用 C# dll 函数
【发布时间】: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 没有任何成功。
  • 您好像忘记接受答案了

标签: c# dll interop c++-cli dllimport


【解决方案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 版本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多