【问题标题】:Invoke C/C++ code from C#从 C# 调用 C/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 可能会更容易。)

标签: c# c++ .net visual-c++ c++-cli


【解决方案1】:

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

【讨论】:

  • 我自己才想出来的(-:。请您这么好心并提供对 P/Invoke 的参考吗?谢谢。
  • @csetzkorn 答案中有一个起点链接。我知道这样的工作可能有点令人沮丧,所以不要气馁。
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多