从 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++ 代码的主要内容,如果未能解决你的问题,请参考以下文章