解决方案 »

  1.   

    不知道你是如何确定DMC5480.h, DMC5480.lib可以在C#下调用的
    dll是确定可以调用的,而.h是C++的头文件,.lib是类库文件
    从来没听说一种语言能够直接使用另一种语言编写的程序文件的
      

  2.   

    C#可以调用封装好的基于纯C的dll,
    但如果是C++的类,没有很简便的方法直接调用。
    使用方法:
    直接添加引用是不行的,使用DLLIMPORT
    可以参考
    http://msdn.microsoft.com/zh-cn/library/aa686045.aspx
      

  3.   

    1、把DMC5480.dll放到exe程序所在的目录
    2、在C#里声明,例如    [DllImport("DMC5480.dll", EntryPoint = "要调用的方法名", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern IntPtr 要调用的方法名();
      

  4.   

    三个文件DMC5480.dll, DMC5480.h, DMC5480.lib是针对不同语言调用不同的库,C#只需使用DMC5480.dll文件即可
      

  5.   


    是供应商说的,他也说过只需要只需使用DMC5480.dll就可以
    但我不知怎么使用
      

  6.   


    跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。
      

  7.   


    跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。也就是说不能在一个类的成员方法 使用动态链接库里的函数???
      

  8.   

    我把dll文件放在bin和obj文件夹下debug文件夹
    然后在一个类中添加如下代码namespace PictureBox
    {
        class GV
        {
            public static double PI = 3.14159265;//相当于全局变量
            [System.Runtime.InteropServices.DllImport("DMC5480.dll", EntryPoint = "d5480_board_init", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
            public static extern IntPtr d5480_board_init(void);    }
    }是不是如这样呢?出现如下这个错误
    Error 1 Invalid parameter type 'void'
    如何解决这个错误呢?
      

  9.   


    既然那里是void那么就不需要传参数了。
    一般可以使用dllimport来引用非托管的dll,如果还是不行,最好找对方的API文档或者DEMO。
      

  10.   

    public static extern IntPtr d5480_board_init(void);
    这是凭什么写出来的?
      

  11.   

    如果C++函数的参数有"void *"类型 的话,C#里面用void * 就用IntPtr
      

  12.   

    写错了,如果C++函数的参数有"void *"类型 的话,C#里面就用IntPtr 
      

  13.   

    如果是void的可以不用写
    现在是可以成功调用了但有些函数是
    d5480_get_backlash(WORD axis, long* backlash);double
    WORD *
    long *
    这些怎么写呢?
      

  14.   

    DMC5480_API void __stdcall d5480_board_close(void); 
    DMC5480_API DWORD __stdcall d5480_board_reset(WORD card);
    DMC5480_API DWORD __stdcall d5480_get_card_version(WORD card);
    DMC5480_API DWORD __stdcall d5480_get_card_soft_version(WORD card, WORD* firm_id, DWORD* sub_firm_id);
    DMC5480_API DWORD __stdcall d5480_get_client_ID(WORD card);
    DMC5480_API DWORD __stdcall d5480_get_lib_version(void);
    DMC5480_API DWORD __stdcall d5480_get_card_ID(WORD card);
    DMC5480_API DWORD __stdcall d5480_get_total_axes(WORD card);
    DMC5480_API DWORD __stdcall d5480_download_firmware(WORD card, const char* pfilename);
    在.h里的一些文件是这样的
      

  15.   

    不建议这样用,会有好多问题。比如说,framework的部署问题、调用问题等等。
      

  16.   

    在那个.h文件里有这个函数
    public static extern IntPtr d5480_board_init();
    现在这样写也可以调用了,
    但换了有参数的就不知怎么写了
      

  17.   

    C++与C#的类型对应关系:
    WORD = UInt16
    WORD* = ref UInt16
    const char* = String
    double = double
    long * = ref Int32
      

  18.   

    // 使用 dllImport 导入。
    // 具体参数还需要看到底怎么使用。
    // 也就说,在 C++ 里面的函数除了签名之外,还需要参数契约。
    // 比如。
    [DllImport("filename.dll")]
    UInt32 d5480_download_firmware(UInt16 card, string filename);
      

  19.   

    贴出你的 setplusmode 的 C++ 签名和 C# 定义。
      

  20.   


    C# 定义
            [DllImport("DMC5480.dll", EntryPoint = "d5480_set_pulse_outmode", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
            public static extern IntPtr d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);C++ 签名
    DMC5480_API DWORD __stdcall d5480_set_pulse_outmode(WORD axis,WORD outmode);
      

  21.   

    h和lib应该主要用在C/C++类语言调用的
    而C#中直接使用DLL就可以了,不需要引用(除非DLL是托管的) ,然后DLLImport声明下就可以直接使用了,只是在使用时候要主要下那些导出函数的引用方式cdecl还是std的~ 
      

  22.   

    DWORD对应C#的Int32 or UInt32        [DllImport("DMC5480.dll", EntryPoint = "d5480_set_pulse_outmode", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
            public static extern UInt32 d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);
      

  23.   

    CallingConvention = CallingConvention.Cdecl 改成 StdCall 或者删除(缺省就是 StdCall) 。和 C++ 的 __stdcall 相对应。
    否则会导致堆栈不正确。
      

  24.   

    改成这样之后还是不行,Int32 or UInt32都不行,还是运行到那里就出错
      

  25.   


    如你所说删除  public static extern UInt32 d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);
    也第一条没有参数的函数还是可以运行,但第二条还是出现以上问题