我目前有一个 C 函数,我想在 .NET (C#) 中使用。
我可以看到实现此目的的两种方法:
在 VC++.NET 上使用/clr 编译它(我认为这是可能的),实现了调用 C 代码的“façade”托管方法。
将 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/