Visual c++ C#-方法';s类型签名与PInvoke不兼容

Visual c++ C#-方法';s类型签名与PInvoke不兼容,visual-c++,pinvoke,dllimport,Visual C++,Pinvoke,Dllimport,我试图在C#(2010)中使用VC++(2003)dll 当我从c#调用dll方法时,我得到了这个错误 “方法的类型签名与PInvoke不兼容” 我又犯了同样的错误! 我错过了什么? 谁能帮我一下吗?如果你说你正在使用结构作为返回值。报告说: 从平台调用返回的结构必须是可blittable类型。平台调用不支持将不可blittable结构作为返回类型 你的结构是不可飞航的。因此不能将其用作函数返回类型 最简单的方法是通过函数的参数返回结构。更改C++函数以接受一个类型的参数:代码> SLFDATA

我试图在C#(2010)中使用VC++(2003)dll 当我从c#调用dll方法时,我得到了这个错误 “方法的类型签名与PInvoke不兼容”

我又犯了同样的错误! 我错过了什么?
谁能帮我一下吗?如果你说你正在使用结构作为返回值。报告说:

从平台调用返回的结构必须是可blittable类型。平台调用不支持将不可blittable结构作为返回类型

你的结构是不可飞航的。因此不能将其用作函数返回类型

最简单的方法是通过函数的参数返回结构。更改C++函数以接受一个类型的参数:代码> SLFDATA*< /C>,并使调用方传递到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;
};

“char”在C#中是2个字节,请改为“byte”。它抱怨您的[DllImport]声明,我们看不到它。我无法修改VC++代码。用字符串替换char[]对我很有效。谢谢@David
[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;
};