当前位置: 代码迷 >> C# >> C#调C++写的DLL函数,出现“方法的类型签名与PInvoke不兼容异常”
  详细解决方案

C#调C++写的DLL函数,出现“方法的类型签名与PInvoke不兼容异常”

热度:81   发布时间:2016-05-05 03:44:23.0
C#调C++写的DLL函数,出现“方法的类型签名与PInvoke不兼容错误”
我在c++中定义的两个结构体:
struct PassInput
{
int sfc;
float rmThick;
float wrdiam[7];
}

struct PassOutput
{
float  eps[7];
float rf[7];
}

调用函数接口: PassOutput  precalc2(PassInput indata)

然后我在C#中定义了结构体:
 public struct PassInput
       {
           public int  sfc; 
           public float  rmThick;
           public float[] wrdiam;
       }
 public  struct PassOutput

public float[] eps;
 public float[] rf;
}

 [DllImport("FMPreLib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern  PassOutput precalc2( PassInput indata);

然后调用代码:
  outdata = precalc2( indata);

最后调试时在上面这句代码出错:方法的类型签名与PInvoke不兼容错误


我是新手,上网看好像是因为C#调用DLL文件时传递结构体出错,应该怎么改?大神帮帮忙啊、、
------解决思路----------------------
c++的定义改成
PassOutput* precalc2(PassInput* indata)


c#
[StructLayout(LayoutKind.Sequential)]
public struct PassInput
{
public int sfc;
public float rmThick;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public float[] wrdiam;
}

[StructLayout(LayoutKind.Sequential)]
public struct PassOutput
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public float[] eps;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public float[] rf;
}

[DllImport("FMPreLib.dll", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr _precalc2(IntPtr indata);

public static PassOutput precalc2(PassInput input)
{
IntPtr indata = IntPtr.Zero;
IntPtr outdata = IntPtr.Zero;
Marshal.StructureToPtr(input, indata, false);
outdata = _precalc2(indata);
return (PassOutput)Marshal.PtrToStructure(outdata, typeof(PassOutput));
}

------解决思路----------------------
http://www.soaspx.com/dotnet/csharp/csharp_20101230_6998.html
http://bbs.csdn.net/topics/390191887
------解决思路----------------------
http://bbs.csdn.net/topics/390191887
------解决思路----------------------
结构体调用,
可以参考这个帖子
http://bbs.csdn.net/topics/391025623