c# - 从 C# 获取非托管 C++ 函数

标签 c# c++ unmanaged managed

我有一些权威的 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/

相关文章:

c# - 如何从 View 模型更新 View 中的单选按钮?

c++ - Assimp 访问 aiNode 名称时出错

c# - 代字号运算符在 C# 中是如何工作的

.net - 使用 C++/CLI 包装非托管 C++ - 一种正确的方法

c# - 将可变长度字节数组从 C# 传递到非托管 C++ dll

c# - 使用 Python 访问 C# 库中的方法 - Interop .dll 文件

c# - 如何在 C# 中使用 Aforge.NET 和 ZXing.NET 从 WebCamera 解码 QRCode

c# - 如何保存剪贴板的副本然后恢复到它?

c++ - 类模板的条件无效成员函数(隐式实例化有效;显式实例化失败)

c++ - 从 Eigen::VectorXd 获取矩阵 View / block ,无需复制(共享内存)