将具有固定大小数组的C结构编组到C#

将具有固定大小数组的C结构编组到C#,c#,arrays,marshalling,fixed-width,C#,Arrays,Marshalling,Fixed Width,我正试图把一个C结构打包成C,就像这样 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] 公共结构着色器 { 公共uint id; [Marshallas(UnmanagedType.ByValArray,SizeConst=Raylib.MAX\u SHADER\u位置)] 公共国际[]LOC; } 和它的C对应物: Shader LoadShader(const char *vsFileName, const char *

我正试图把一个C结构打包成C,就像这样

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
公共结构着色器
{
公共uint id;
[Marshallas(UnmanagedType.ByValArray,SizeConst=Raylib.MAX\u SHADER\u位置)]
公共国际[]LOC;
}
和它的C对应物:

Shader LoadShader(const char *vsFileName, const char *fsFileName)
typedef结构着色器{
无符号int-id;//着色器程序id
int locs[MAX_SHADER_LOCATIONS];//着色器位置数组
}着色器;
MAX_SHADER_LOCATIONS在C和C中都是一个常量,设置为32

这里的解决方案与此相同

我用来测试它的函数是

[DllImport(nativeLibName,CallingConvention = CallingConvention.Cdecl)]
public static extern Shader LoadShader(string vsFileName, string fsFileName);
和它的C对应物:

Shader LoadShader(const char *vsFileName, const char *fsFileName)

当我尝试使用这个函数时,我得到一个错误“方法的类型签名与PInvoke不兼容”。知道我做错了什么吗?

我检查了,它返回的是着色器结构,而不是指针。我在问题中添加了C版本。返回类型是问题所在。它不是一个“blittable”结构,因为数组需要pinvoke marshaller创建托管结构、复制数据并销毁C结构。后者是个问题,它不知道怎么做。如果可以更改C函数,则为其提供一个额外参数,
Shader*
。非常重要的是,这个函数总是需要某种方式来表示失败。为它指定一个错误代码的int返回值。唯一可以做的另一件事是使用固定大小的缓冲区,而不是数组,
public fixed locs int[32]我以前使用过fixed,但它要求我编译为不安全的。那么就没有办法马歇尔这样的固定数组了?我无法真正更改C函数的签名,因为它是库的一部分。