C# DllImport 尝试读取或写入受保护的内存

C# DllImport Attempted to read or write protected memory

我正在尝试使用 DllImport 从 C++ 库调用函数

[DllImport("DLL.dll", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr XXX(double dtoday, double dexp, double fwd, double[] sList, double[] vList);

C++函数的签名是

std::vector <double> XXX( const double dtoday,
                const double dexp,
                const double fwd,
                const std::vector <double> &sList,
                const std::vector <double> &vList)

我遇到的问题是 &sList 和 &vList 在到达 C++ (dll) 时为空,我认为这是由于函数定义中的 & 而发生的。

我已经在导入签名中尝试 [In, Out] ref vList,但这并没有解决问题。

如果有人有任何想法,我们将不胜感激

谢谢

问题是 std::vector <double> 的使用。 p/invoke 根本不可能做到这一点。 C++ 类 不能用作 p/invoke 参数。

您需要将其转换为良好的老式数组才能取得进展。 return 值也需要一些特殊处理。通常的做法是让调用者分配内存,然后被调用者填充它。

如果您要调用大量此类函数,那么您可能会发现将它们全部包装在 p/invoke 友好函数中的负担太累人了。在这种情况下,建议使用 C++/CLI。您将能够直接调用 C++ 代码,并使用标准 .net 类型公开 .net 接口。