C# - 方法的类型签名与PInvoke不兼容

时间:2014-11-29 12:04:11

标签: visual-c++ pinvoke dllimport

我试图在C#中使用VC ++(2003)dll(2010)     当我从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;
    };

然而我又得到了同样的错误! 我在这里错过了什么? 任何人都可以帮我Plzz

1 个答案:

答案 0 :(得分:1)

您说您正在使用结构作为返回值。 documentation说:

  

从平台调用调用返回的结构必须是blittable类型。平台调用不支持非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;
};