我在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