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

Bog*_*vic 12 c# dll interop c++-cli dllimport

我有一个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()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我打算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);
Run Code Online (Sandbox Code Playgroud)

这是函数,其中称为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);
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:"语法错误:标识符'计算'".有人可以帮我解决这个可怕的错误吗?

san*_*oIT 22

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

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

using namespace Your::Namespace::Here;

#using <YourDll.dll>

YourManagedClass^ pInstance = gcnew YourManagedClass();
Run Code Online (Sandbox Code Playgroud)

其中'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);   
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴它有所帮助.如果它解决了您的问题,请不要忘记将答复标记为答案;-) Thx! (5认同)
  • 观看您的框架版本!这只是一个巨大的注意。一些 Visual C++ 项目希望默认为 .NET 4,而您的 DLL 可能会默认为 .NET 4.5,并且当您尝试运行类似的代码时,它可能会抱怨诸如“找不到文件”之类的混淆错误。好吧,您需要卸载 Visual C++ 项目,然后编辑项目文件的 XML 标记以强制它针对 .NET 4.5 进行编译。然后它会起作用。花了一个小时在这个问题上摸不着头脑......大声笑:) (2认同)