在C#中使用UnManaged C ++ Dll

时间:2015-01-09 15:06:37

标签: marshalling

嗨,这是我在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。 编组是否存在问题。提前谢谢

2 个答案:

答案 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);