c# - 从托管代码调用 C 代码

标签 c# c++-cli interop pinvoke

我目前有一个 C 函数,我想在 .NET (C#) 中使用。

我可以看到实现此目的的两种方法:

  1. 在 VC++.NET 上使用/clr 编译它(我认为这是可能的),实现了调用 C 代码的“façade”托管方法。

  2. 将 C 代码编译为 DLL,然后进行 API 调用。

你觉得什么最好?如何做第一个?

更新

根据要求,这是我需要从我的托管代码调用的(唯一)函数:

int new_game(double* params1, double* params2);

还有一个问题(虽然更难)

我有一个表单函数

int my_hard_to_interop_function(double** input, double **output, int width);

其中输入和输出都是二维 double 组。它们的宽度由 width 给出,它们的高度由函数知道。我应该从我的 C# 应用程序调用此 C 方法。

最佳答案

如果这是一个简单的 C API,那么访问它的最直接方法是使用 PInvoke。 PInvoke 正是为这种情况而设计的。

您可以发布 C 方法的签名吗?如果是这样,我们可以提供适当的托管签名。

编辑

[DllImport("insert_the_dll_name_here")]
public static extern int new_game(ref double param1, ref double param2);

正如 Hans 所指出的,鉴于参数的复数名称,这些参数似乎可能是数组而不是单个值。如果是这样,那么签名将需要更改以说明这一点。例如,如果它们是预定的固定大小,则签名将如下所示

[DllImportAttribute("insert_the_dll_name_here"]
public static extern int M1(
  [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)] 
  double[] params1),
  [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)] 
  double[] params2) ;

关于c# - 从托管代码调用 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002240/

相关文章:

c# - 从 C# 到 F# 的回调

c++ - 为什么原生 C++ 与 C++ 互操作性表现不佳?

c# - 为什么使用 IntPtr 作为句柄?

wpf - Window.SourceInitialized 事件何时引发

c# - 无法使用与其底层 RCW 分离的 COM 对象 - 为什么会发生这种情况?

c# - 如何使用 WCF 更改外部对象的名称?

c# - 分区列表<T>?

c++ - 在 VS.NET 2010 中构建 C++ 单元测试项目时出现链接错误

c++ - C++/LabVIEW互操作: error extracting data from LabVIEW array/unexpected type conversion in function parameter

c# - 如何为地址结构生成唯一标识符?