嗨,这是我在C ++ dll中的功能。 我试图在My C#Application中使用它。尝试了很多东西,但似乎没有什么对我有用。
xyz_API LONG __stdcall xyz_Login(char *dwIP,unsigned short dwPort,char *dwUseName,char
*dwPassword,MyDetail dwInfo,char *dwInfo);
* Parameter:
[IN]
dwIP
dwpPort
dwUseName
dwPassword
[OUT]
MyDetail(struct)
这是结构:
typedef struct
{
int xyz_id;
int xyz_ch;
int xyz_total;
int my_id;
char my_Info[10];
char m_status;
}MyDetail ,*MyDetail ;
我在我的代码中为这个Struct创建了一个Class:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class MyDetail
{
public int xyz_id;
public int xyz_ch;
public int xyz_total;
public int my_id;
[MarshalAs(UnmanagedType.ByValArray,
ArraySubType = UnmanagedType.LPStr, SizeConst = 10)]
public char[] my_Info;
public sbyte m_status;
}
我正在使用以下代码行在C#应用程序中使用它:
[DllImport("MYC.dll", EntryPoint = "xyz_Login", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int xyz_Login([MarshalAs(UnmanagedType.LPWStr)]string dwIP, ushort dwPort, [MarshalAs(UnmanagedType.LPWStr)] string dwUseName, [MarshalAs(UnmanagedType.LPWStr)] string dwPassword, MyDetail dwmyInfo, [MarshalAs(UnmanagedType.LPWStr)]string dwInfo);
我的表格致电:
MyDetail obj= new MyDetail();`enter code here`
int result = xyz_Login("192.168.1.10", 9001, "admin", "admin", obj, null);
代码完美但但没有输出。 MyDetail对象始终返回null。 编组是否存在问题。提前谢谢
答案 0 :(得分:0)
首先,C ++函数:
xyz_API LONG __stdcall xyz_Login(char *dwIP,unsigned short dwPort,char *dwUseName,char
*dwPassword,MyDetail dwInfo,char *dwInfo);
参数“dwInfo”是结构类型,而不是指针或引用类型,因此参数是按值传递的,因此在函数xyz_Login中,您正在修改结构的本地副本,而不更改结构在C#中。所以你应该改变它:MyDetail* dwInfo
同时,您应该将C#中的dllimport更改为:
[DllImport(“MYC.dll”,EntryPoint =“xyz_Login”,SetLastError = true,CharSet = CharSet.Ansi,ExactSpelling = true,CallingConvention = CallingConvention.StdCall)] public static extern int xyz_Login(string dwIP,ushort dwPort,string dwUseName,string dwPassword,ref MyDetail dwmyInfo,string dwInfo);
在PInvoke调用中,ref struct被转换为指向struct的指针;另外,char *是ansi,不是unicode。
答案 1 :(得分:0)
我使用以下方法运行:
结构为:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class MyDetail
{
public int xyz_id;
public int xyz_ch;
public int xyz_total;
public int my_id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string my_Info;
public sbyte m_status;
}
DLLImport语句AS:
[DllImport("MYC.dll", EntryPoint = "NET_DVR_Login")]
public static extern Int32 xyz_Login(string dwIP, UInt16 dwPort, string Name,string dwPassword, IntPtr myDetail, char[] info);