我正在尝试在 C# (2010) 中使用 VC++ (2003) dll
当我从 C# 调用 dll 的方法时出现此错误
“方法的类型签名与 PInvoke 不兼容”
I am returning the structure from VC++
Code:
struct SLFData
{
public:
char ByLat[10];
char ByLong[10];
};
And I am marshalling in C#
Code:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SLFData
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] ByLat;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] ByLong;
};
我再次遇到同样的错误!
我在这里缺少什么?
有人可以帮我吗?
您说您正在使用该结构作为返回值。这文档 http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx says:
从平台调用返回的结构必须是 blittable 类型。平台调用不支持非 blittable 结构作为返回类型。
您的结构不可直接复制。所以你不能将它用作函数返回类型。
最简单的方法是通过函数的参数返回结构。更改 C++ 函数以接受类型参数SLFData*
并让调用者传入 C++ 函数填充的结构体的地址。在 C# 方面,您将结构体作为out
范围。
FWIW,您的结构声明是错误的。对于 C# 入门char
是两个字节宽。最好这样做:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SLFData
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string ByLat;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string ByLong;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)