从 C# 调用 C/C++ 代码

Posted

技术标签:

【中文标题】从 C# 调用 C/C++ 代码【英文标题】:Invoke C/C++ code from C# 【发布时间】:2012-11-29 15:51:59 【问题描述】:

我通常使用 C#,但很高兴通过 C++ 调用 C 方法。所以我写了一个这样的 C++ 包装器:

C++ 头文件如下所示:

#pragma once

using namespace System;

namespace CSharpToCPP 

    public ref class SomeWrapper
    
        public:
        double ReturnValue();
    ;

C++ 代码如下所示:

double CSharpToCPP::SomeWrapper::ReturnValue()

    return 1;

这给了我可以在 C# 中引用的 dll。 C# 中的工作代码如下所示:

class Program

    static void Main(string[] args)
    
        SomeWrapper Wrapper = new SomeWrapper();

        Console.WriteLine(Wrapper.ReturnValue());
    

现在我想在 C++ 方法 ReturnValue 中创建一些数据并使用此签名调用 C 方法:

real_T get_value(const e_struct_T parameters, real_T temp)

有人可以这么好心并指出正确的方向来解释什么是 const e_struct_T 以及如何创建此类数据吗? C 代码是自动生成的,应该采用具有已知内容的结构。我试图在头文件中定义这样的结构:

struct Parameters
    double x;
    int y;
    char z1;
    bool z2;
;

然后用这样的数据填充它:

Parameters Ps;
Ps.x = z2;
Ps.x = 2.0;

在像这样调用 get_value 之前:

get_value(Ps, 10.0);

这不起作用。谢谢!

【问题讨论】:

如果你为你的 C++ 类使用 C++/CLI 包装器,你会省去很多麻烦 他是。 (实际上,像这样的简单调用使用 P/Invoke 可能会更容易。) 【参考方案1】:

您必须搜索包含e_struct_t 定义的头文件,包含在调用文件中,并使用该类型的变量传递给get_value; 顺便说一句,如果您想从C# 调用的目标方法是纯C,您可能应该考虑直接使用P/Invoke (a tutorial here) 而不是创建C++ 包装器。此外,通过简单的 P/Invoke,您将大大简化部署(无需额外的 dll)

【讨论】:

我自己才想出来的(-:。请您这么好心并提供对 P/Invoke 的参考吗?谢谢。 @csetzkorn 答案中有一个起点链接。我知道这样的工作可能有点令人沮丧,所以不要气馁。

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

C#调用C/C++的dll,一个库中包括多个函数,每调用一个函数都要用DllImport加载吗?求大神

C#调用C/C++ DLL方式

深入xLua实现原理之C#如何调用Lua

在 C# 中调用 C/C++ 方法

C#调用C/C++ DLL 参数传递和回调函数的总结

C#上位机开发(十四)—— C#中通过dll库调用外部C/C++函数