【发布时间】:2015-08-16 00:48:01
【问题描述】:
我正在尝试 P 调用 C 库以在 Xamarin android 应用程序上使用。
考虑以下 C 结构:
typedef struct
{
bool myBool;
myOtherStruct sOtherStruct;
int myInt;
float myFloat;
float myFloatArray[1024];
float myFloatArray2[1024];
float myFloatArray3[20];
float myFloatArray4[30];
} sMyStruct;
这是使用以下函数调用的:
unsigned int initialise(sMyStruct* a_pMyStruct)
我已将其放入 C# 结构中:
[StructLayout(LayoutKind.Sequential)]
public unsafe struct SMyStruct
{
bool myBool;
myOtherStruct sOtherStruct;
int myInt;
float myFloat;
public fixed float myFloatArray[1024];
public fixed float myFloatArray2[1024];
public fixed float myFloatArray3[20];
public fixed float myFloatArray4[30];
public unsafe float[] MyFloatArray
{
get
{
fixed (float* ptr = myFloatArray)
{
float[] array = new float[1024];
Marshal.Copy((IntPtr)ptr, array, 0, 1024 * sizeof(float));
return array;
}
}
}
public SMyStruct (bool MyBool, myOtherStruct otherStruct, int MyInt, float MyFloat)
{
myBool = MyBool;
sOtherStruct = myOtherStruct;
myInt = MyInt;
myFloat = MyFloat;
}
这是我在 C# 中调用它的函数:
[DllImport("libMylib")]
private static extern unsafe uint initialise(SMyStruct* a_pMyStruct);
然后我调用这个函数:
public unsafe void init ()
{
SMyStruct initStruct;
uint result = initialise(&initStruct);
}
因此,C 函数将返回包含大量数据的结构。然后我再次将该结构传递给另一个 C 例程,该例程将这些参数用于程序的其余部分。
我的问题是如何将浮点数组数据返回到正确的结构变量中,以便再次传递它?目前我的代码基于这些问题: Marshalling float Array to c# 和 Marshalling complex struct to c#
但我没有设法编写此代码,因此我可以将浮点数组传回我的结构,甚至不会看到编译器错误(更不用说在测试时失败了!)
如何将浮点数组数据放入我的结构中?
编辑 经过几个答案和 cmets,我正在添加我最初正在做的事情以尝试增加一些清晰度。
当我没有使用上面的“public unsafe float[]...”例程时,我得到了一个编译器错误(在结构内):
public SMyStruct (bool MyBool, myOtherStruct otherStruct, int MyInt, float MyFloat, float* MyFloatArray, float* MyFloatArray2, float* MyFloatArray3, float* MyFloatArray4)
{
myBool = MyBool;
sOtherStruct = myOtherStruct;
myInt = MyInt;
myFloat = MyFloat;
myFloatArray = MyFloatArray;
myFloatArray2 = MyFloatArray2;
myFloatArray3 = MyFloatArray3;
myFloatArray4 = MyFloatArray4;
}
使用此代码,我收到错误“您不能使用包含在未固定表达式中的固定大小缓冲区。尝试使用固定语句” 此时我尝试改用复制例程。
我想要的是确保字段 myFloatArray、myFloatArray2 等被初始化函数返回的任何内容填充。仅供参考,myBool、sOtherStruct 等按我的预期填充。
【问题讨论】:
-
您真的需要访问数据吗?还是您只是将其传递给另一个外部(非托管)方法?如果您不需要从 .Net 访问它,您可以只分配一个 IntPtr 并将其提供给下一个方法
-
@JamesBarrass 我实际上没有,我一直想输出数据,以便我可以证明它作为中间步骤工作。您可以指出 Alloc 和 IntPtr 的一个很好的例子吗?谢谢。
-
很难猜测“回传”可能意味着什么,这个问题缺少实际生成错误的代码。
-
@HansPassant 我已经编辑了我的问题以显示我之前在做什么会激活错误。
标签: c# arrays pointers struct pinvoke