【发布时间】:2009-11-19 02:54:07
【问题描述】:
我有一个常规 dll 导出了以下函数。
extern "C" __declspec(dllexport) int FindNearestStuff(double _latitude, double _longitude , LocationStruct * locations[])
LocationStruct 很简单
struct LocationStruct
{
long positionIndex;
long item;
};
我正在尝试使用 c# 调用它
[DllImport("myclever.dll", CharSet = CharSet.None)]
private static extern int FindNearestStuff(double _latitude, double _longitude,
ref LocationStruct [] locations);
这一切都很酷很时髦,我可以从调试器进入 dll 函数。 在 dll 中,LocationStruct 数组被正确填充,一切都很好。
我遇到的问题是当它从 dll 返回时,LocationStruct 数组没有返回数据 - 只是空值...
我错过了什么?
【问题讨论】:
-
struct LocationStruct { long roadIndex;长tdist; };并在 c# internal struct LocationStruct { public int roadIndex; //在 C 代码中为 long public int tdist;//在 C 代码中为 long };
-
我不认为 P/Invoke 可以在这里处理双重间接(在 C# 端由
ref传递的数组,在 C++ 端由指针传递)。你真的需要它吗?指向结构数组中第一个元素的指针不会在 C++ 中执行吗? -
我能想到的最简单的方法是使用不安全的 C#。还记得使用 StructLayout.Sequential
-
所有 C# 结构都是隐式的
Sequential。 -
感谢帕维尔;这为我节省了很多打字时间!
标签: c# arrays data-structures