我有一些权威的 ANSI 标准 C 代码。这意味着虽然我有源代码,但我不能翻译成另一种语言,也不能修改调用参数,因为这些操作会使权限无效。有 150 多个函数。
我可以进行附带更改,例如将文件名从 .C 更改为 .CPP,以便使用 Visual Studio 2009 的 C++ 编译器进行编译,我已经完成了。还可以添加编译器指令等。如有必要,我还可以通过包装层。
另一个限制是我的公司不希望我在任何 C# 代码中使用 unsafe 关键字。
我需要从 C# 程序中获取这些函数。
典型的 C/C++ 函数如下所示:
double SomeFunction(double a, double[3] vec, double[3][3] mat);
其中数组内容有时输入,有时输出,很少同时输入。
我首先尝试制作一个非托管 DLL(带有标记为 Extern C 的函数)。只有简单参数(int、double)的函数工作正常,但我无法确定如何编码数组。 (其实我确实找到了一些示例代码,但是重复150次非常复杂和不合理。)
然后,我在同一个解决方案中尝试了两个项目,一个使用 C++,另一个使用 C#。在 C++ 项目中,我创建了一个托管函数,它只调用标记为非托管的原始函数。这是非常干净和简单的,再一次,简单的论点工作得很好。但是对于数组,我找不到如何使参数类型在 C# 到 C++ 边界之间匹配:
<i> Argument '2': cannot convert from 'double[]' to 'double*'</i>
(并且如上所述,我不能使用 unsafe 来获取指针)。
当然,我正在尝试做的事情一定是可能的。
获得这些功能的最佳方式是什么?
(使用上述函数的示例代码会非常酷。)
最佳答案
示例 C/C++ 实现:
extern "C" __declspec(dllexport)
double SomeFunction(double a, double vec[3], double mat[3][3]) {
double sum = a;
for (int ix = 0; ix < 3; ++ix) {
sum += vec[ix];
for (int iy = 0; iy < 3; ++iy) {
sum += mat[ix][iy];
}
}
return sum;
}
示例 C# 用法:
private void Form1_Load(object sender, EventArgs e) {
double[] vec = new double[3];
double[,] mat = new double[3, 3];
for (int ix = 0; ix < 3; ++ix) {
vec[ix] = ix;
for (int iy = 0; iy < 3; ++iy) {
mat[ix, iy] = (ix + 1) * iy;
}
}
double sum = SomeFunction(1, vec, mat);
}
[System.Runtime.InteropServices.DllImport("cpptemp8.dll")]
private static extern double SomeFunction(double a, double[] vec, double[,] mat);
关于c# - 从 C# 获取非托管 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/604470/