c++写的dll中的函数:
public static extern Int16 dc_read(Int16  icdev, byte _Adr,byte *_Data);
  
我在c#中的声明:   
  [DllImport("test.dll")] 
  byte[] readata = new byte[16];
  private   static   extern   Int16 dc_read(icdev, 0, readata);
 
 编译,错误 参数“3”: 无法从“byte[]”转换为“byte*”
 在C中这么写是可以的!
 请问大家,在C#中怎么解决这样的指针问题!
 怎么休息上面的这段代码?   

解决方案 »

  1.   

    private static extern Int16 dc_read(icdev, 0, ref readata); //加一个ref或out就是以引用方式调用,相当于指针了
      

  2.   

    试过了,但是结果是一样的!
    错误  参数“3”: 无法从“out byte[]”转换为“byte*”
    继续在线等各位大虾的正解!
      

  3.   

    use System.IntPtr
    System.IntPtr ptr = Marshal.AllocHGlobal( size);
      

  4.   

    在C#里,byte[]和byte*是两个完全不同的类型。
      

  5.   

    use System.IntPtr
    System.IntPtr ptr = Marshal.AllocHGlobal( size);什么意思?没看明白!
      

  6.   

    “在C#里,byte[]和byte*是两个完全不同的类型。”我当然知道,但是要用别人的动态库做2次开始,必须的这么声明!
      

  7.   

    大虾们呢,这种调用C编写的DLL的.net 开发没人做过吗?!
    在C中声明了一些带指针的参数,在C#中如何才能调用!
    在线等正解!
      

  8.   

    "我当然知道,但是要用别人的动态库做2次开始,必须的这么声明!"hdt(倦怠)大虾都已经给出方法来了。System.IntPtr是C#中的指针类型,专门用来匹配unmanaged code中的指针的。
      

  9.   

    更好的因该这样
    byte[] bytes = new bytes[16];
    System.IntPtr bp = Marshal.UnsafeAddrOfPinnedArrayElement( bytes , 0 );
    dc_read( ... , ..  , bp );
      

  10.   

    byte[] bytes = new bytes[16];
    System.IntPtr bp = Marshal.UnsafeAddrOfPinnedArrayElement( bytes , 0 );
    dc_read( ... , ..  , bp );----
    厉害!
      

  11.   

    大家看看结果!
    byte[] readata = new byte[16];
    System.IntPtr  bp = Marshal.UnsafeAddrOfPinnedArrayElement(readata, 0);
    Int16 readnum = dc_read(icdev, 0, bp);错误 1 与“mifareone.Form1.dc_read(short, byte, byte*)”最匹配的重载方法具有一些无效参数
        2. 参数“3”: 无法从“System.IntPtr”转换为“byte*”
      

  12.   

    DLL 中的声明:int dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);在C#中的声明:public static extern Int16 dc_read(Int16  icdev, byte _Adr,byte *_Data);
      

  13.   

    改为public static extern Int16 dc_read(Int16  icdev, byte _Adr, System.IntPtr _Data);
      

  14.   

    DLL中申明不对。
    [DllImport("test.dll")]
    private static extern Int16 dc_read(Int16 icdev, byte _Adr, IntPtr _Data);
      

  15.   

    谢谢大家,编译是通过了,但是返回值不对!我再把问题描述清楚一点!我用C#调用一个DLL做2次开发!DLL 中的函数声明:int dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);
                      返 回:成功则返回 0
                      例:int st;
                          unsigned char data[16];
                          st=dc_read(icdev,4,data);//data 需要得到的数据
    C#中声明:[DllImport("test.dll")]
              private static extern Int16 dc_read(Int16 icdev, byte _Adr, IntPtr _Data);
    调用如下:byte[] readata = new byte[16];
              System.IntPtr  bp = Marshal.UnsafeAddrOfPinnedArrayElement(readata,0);
              Int16 readnum = dc_read(icdev,4,bp);//readnum!=0 大家看看哪里还有错误!谢谢!在线等!
      

  16.   

    usinged char*注意字符编码
    C#默认是unicode 
    c++ 可能会是ansiusing char* 可以考虑用stringbuilder 而非byte*
      

  17.   

    EN,C++ 的int =C# int16
      

  18.   

    [DllImport("test.dll")]
    private static extern Int16 dc_read(Int16 icdev, byte _Adr, [MarshalAs(UnmanagedType.U4)] out UInt32 _Data);//UInt32 要换成 byte
      

  19.   

    注意它的修改:
    [MarshalAs(UnmanagedType.U4)] out UInt32
      

  20.   

    问了厂家,看了例子!C#中声明:[DllImport("dcrf32.dll")]
         public static extern short dc_read ( int  icdev, int adr,[Out] byte[] sdata ); 谢谢大家,大家以后遇到这样的问题就有经验了!
      

  21.   

    C# 里的指针只能在不安全的代码
    中执行
         通过unsafe  关键字 fixed()申明指针
        public unsafe void aa(int *p){
       *p=4566;
       
    } class test{
       public unsafe void bb(){   fixed(int *p){
       //代码}
    }
    }