我有一个未管理的dll,导出以下函数:
假设SomeData是:
现在我想从C#代码中调用此函数。我开始定义需要自定义封送的C#结构,如下所示:
这样做,我得到了MarchalDirectiveException异常:“无法编组'return value':无效的托管/非托管类型组合(Int/UInt必须与SysInt或SysUInt配对)。 ”
在C#中,我没有为SomeData分配内存,因为我希望该内存在C函数中分配,然后我将使用Marshal.Copy将其传递到托管内存。
有什么想法吗?谢谢
------------------------ JaredPar回答后编辑 --------------------
实际上,当我将代码复制到我的问题中时,我犯了一个错误。我正在使用的真正托管签名是:
[DllImport("DynamicLibrary.dll", CharSet = CharSet.Auto)] [return:MarshalAs(UnmanagedType.LPStruct)] public static extern IntPtr test();
JaredPar的答案仍然相关。要获得正确的行为,我有两个选择:
1)使用“public static extern IntPtr test();”(不带MarshalAs属性的)签名,然后像JaredPar建议的那样访问返回的指针。
2)使用“public static extern SomeData test();”(带有MarshalAs属性)然后简单地使用SomeData sd = test();
SomeData* test();
假设SomeData是:
typedef struct _Data Data;
struct _Data{
int a;
int b;
}
现在我想从C#代码中调用此函数。我开始定义需要自定义封送的C#结构,如下所示:
[StructLayout(LayoutKind.Sequential)]
public class SomeData
{
public Int32 a;
public Int32 b;
}
现在,我声明了托管函数:
[DllImport("DynamicLibrary.dll", CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.LPStruct)]
public static extern SomeData test();
在主函数中我有:
IntPtr ptr = test();
这样做,我得到了MarchalDirectiveException异常:“无法编组'return value':无效的托管/非托管类型组合(Int/UInt必须与SysInt或SysUInt配对)。 ”
在C#中,我没有为SomeData分配内存,因为我希望该内存在C函数中分配,然后我将使用Marshal.Copy将其传递到托管内存。
有什么想法吗?谢谢
------------------------ JaredPar回答后编辑 --------------------
实际上,当我将代码复制到我的问题中时,我犯了一个错误。我正在使用的真正托管签名是:
[DllImport("DynamicLibrary.dll", CharSet = CharSet.Auto)] [return:MarshalAs(UnmanagedType.LPStruct)] public static extern IntPtr test();
JaredPar的答案仍然相关。要获得正确的行为,我有两个选择:
1)使用“public static extern IntPtr test();”(不带MarshalAs属性的)签名,然后像JaredPar建议的那样访问返回的指针。
2)使用“public static extern SomeData test();”(带有MarshalAs属性)然后简单地使用SomeData sd = test();