例如,有个c的DLL,有个函数如下,函数名称
int Init(char *AMMNO, char *state,char* Version, char* SessionID ,char *R1, char* message1);
参数说明
入参
AMMNO:ESAM序列号;8字节
State:状态;1字节;00—0状态,01—1状态
Version:版本;1字节,固定“01”
SessionID:会话ID;1字节;00‐‐新建,01‐‐恢复
R1:随机数1;16字节出参
message1:N字节(大于1K,小于2K)返回值
0:正常
1001:序列号错误
1002:状态标识错误
1003:版本错误
1004:会话ID错误
1005:随机数错误
C# 中怎么调用这样调用不成功,值传的不对,提示序列号错误
 [DllImport("MYDll.dll")]
 public static extern int Init(byte[] AMMNO, int state, int Version, int SessionID, byte[] R1, ref byte[]message1);第一个值AMMNO要传递的是“0000E10800000060”用第二种方法 也不行,
 public static extern int Init(string AMMNO, string state, string Version, string SessionID, string  R1, ref string message1);请问在C#中要怎么调用C中的函数

解决方案 »

  1.   

    Marshal.AllocHGlobal
    Marshal.Copy
    方法就应该够了。
      

  2.   

    一般而言就是byte[]和string,如果不对要自己仔细检查每一个要转换的地方到底是要用byte[]还是string,或者是自己代码有问题!!!
      

  3.   


    用string 如果字符串的长度是16(8字节), 程序直接退出了
    如果字符串的长度是8(8字节),返回序列号不对,传的值不正确才会提示序列号不对
      

  4.   

    8个字节内容是这个,0000E10800000060转为string 是什么样的
      

  5.   

    我转为字符串为 string s = "0000E10800000060"这样不行。
      

  6.   

    这样肯定不行。超长了。其实这是把字节的。
    { 0x00,0x00,0xE1,0x08,0x00,0x00,0x00,0x60 }
    这样的字节数组
      

  7.   

    String sAs = Encoding.ASCII.GetString({ 0x00,0x00,0xE1,0x08,0x00,0x00,0x00,0x60 });
    这样的是八位。
      

  8.   

    用StringBuilder 可以了, 
      

  9.   

    我刚问百度了,
    http://bbs.csdn.net/topics/330082022
      

  10.   

    http://bbs.csdn.net/topics/330082022
      

  11.   

    用StringBuilder 吧 变长的.
      

  12.   

    8字节的用 ref long
    1字节的用 ref char