我不知道这里有什么问题。
我有大量的 p/invoke 调用正常工作......除了这个。
我设法将我的问题减少到以下示例代码。
如果我删除任一结构成员(双精度或整数),它工作正常。
我假设问题在某种程度上与结构的布局有关 - 但是当我在 C 中执行 sizeof() 和在 C# 中执行 Marshal.SizeOf() 时,它们都返回相同的值......所以如果结构大小在 C# 和 C 中是相同的,可能是什么问题?
我显然在这里遗漏了一些基本的东西。
SampleDLLCode.c
#pragma pack(1)
typedef struct SampleStruct {
double structValueOne;
int structValueTwo;
} SampleStruct;
__declspec(dllexport) SampleStruct __cdecl SampleMethod(void);
SampleStruct SampleMethod(void) {
return (SampleStruct) { 1, 2 };
}
构建脚本
gcc -std=c99 -pedantic -O0 -c -o SampleDLLCode.o SampleDLLCode.c
gcc -shared --out-implib -o SampleDLL.dll SampleDLLCode.o
C# 代码
using System;
using System.Runtime.InteropServices;
namespace SampleApplication
{
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct SampleStruct {
public double structValueOne;
public int structValueTwo;
}
class Program
{
[DllImport("SampleDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern SampleStruct SampleMethod();
static void Main(string[] args)
{
SampleStruct sample = SampleMethod();
}
}
}