Dll中的函数定义如下
extern "C" _API int __stdcall Block (short *block);
我该怎么声明这个函数?这么声明可以么?
[DllImport("_API.dll")]
public unsafe static extern int Block(short * block);如果声明这样的不安全代码,c#中该如何使用呢

解决方案 »

  1.   

    [DllImport("_API.dll")]
            public static extern int Block(short[] block);
    这样就行了,
    short[] block=new short[1];
    block[0]=123;
    Block(block);
      

  2.   

    不需要unsafe, 如果遇到指针就unsafe,干脆把c#工程设置成允许unsafe编译,直接把C++的开发放到C#里得了[DllImport("_API.dll")]
    public static extern int Block(short[] block);
      

  3.   

    TO:2楼,
    用指针参是为了传出参数。
    就算加了一个out ,而我根本无法保证传出数组的长度(不固定),产生错误的可能性会很大!
      

  4.   

            [DllImport("FTD2XX.dll")]
            static extern unsafe FT_STATUS FT_ListDevices(void* pvArg1, void* pvArg2, UInt32 dwFlags); // FT_ListDevices by number only
            [DllImport("FTD2XX.dll")]
            static extern unsafe FT_STATUS FT_ListDevices(UInt32 pvArg1, void* pvArg2, UInt32 dwFlags);        private unsafe bool ListUnopenDevices()
            {
                FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR;
                UInt32 numDevs;
                int i;
                byte[] sDevName = new byte[64];
                int iCurrentIndex;
                void* p1;            itemlist.Clear();            p1 = (void*)&numDevs;
                ftStatus = FT_ListDevices(p1, null, FT_LIST_NUMBER_ONLY);            if (ftStatus == FT_STATUS.FT_OK)
                {
                    if (dwListDescFlags == FT_LIST_ALL)
                    {
                        for (i = 0; i < numDevs; i++)
                        {
                            itemlist.Add(i);
                        }
                    }
                    else
                    {
                        for (i = 0; i < numDevs; i++)
                        {
                            fixed (byte* pBuf = sDevName)
                            {
                                ftStatus = FT_ListDevices((UInt32)i, pBuf, dwListDescFlags);
                                if (ftStatus == FT_STATUS.FT_OK)
                                {
                                    string str;
                                    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                                    str = enc.GetString(sDevName, 0, sDevName.Length);
                                    itemlist.Add(str);
                                }
                                else
                                {
                                  //  MessageBox.Show("Error list devices" + Convert.ToString(ftStatus), "Error");
                                    return false;
                                }
                            }
                        }
                    }
                }                        return true;
            }
      

  5.   

    碰巧最近我也C# 调  C++ dll大概这样,  你试试:C++
    void Test(HWND hwnd,CDC *pDC);C#
    [DllImport("TestDll.dll", EntryPoint = "Test")]
    public static extern void Test(IntPtr hwnd,IntPtr pDC);
    调用:
    IntPtr hDestopDc = GetWindowDC((IntPtr)0);// GetWindowDC自己声明
    InitTypeSet(this.Handle, hDestopDc);字符串:C++
    void Test2(LPCTSTR lpFileName);C#[DllImport("TestDll.dll", EntryPoint = "Test2")]
    public static extern void Test2([MarshalAs(UnmanagedType.LPTStr)] string lpFilePath);
      

  6.   

    曾经用过打开一个串口的程序,不过没有涉及到unsafe的问题,关注一下了
      

  7.   

    用object传递行么?
    object是所有类的基类,而且是按引用传递,很像void*这个指针。
    这样就可以避免了unsafe代码,不知能行得通么
      

  8.   

    现在功能基本实现了/// <summary>
    /// 按块读取冲击采集数据,须上传后有效
    /// </summary>
    /// <param name="impblock">数组,传出采集的数据用</param>
    /// <returns>返回数据块长度</returns>
    [DllImport("dsad.dll")]
    private  static extern int ImpGetBlock([MarshalAs(UnmanagedType.LPArray)] short [] block);  public static short[] DllImpGetBlock(int blockLen)
    {
    short [] outBlock = new short [blockLen];
                            //blockLen 长度不够就会产生错误,预分配的内存要足够大,这个是个问题
    int len = ImpGetBlock(outBlock); 
    return outBlock;
    }
    TO :15楼,object传参可以,应用时转换会出错