请问如何添加dll文件 动态链接库dll 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道你是如何确定DMC5480.h, DMC5480.lib可以在C#下调用的dll是确定可以调用的,而.h是C++的头文件,.lib是类库文件从来没听说一种语言能够直接使用另一种语言编写的程序文件的 C#可以调用封装好的基于纯C的dll,但如果是C++的类,没有很简便的方法直接调用。使用方法:直接添加引用是不行的,使用DLLIMPORT可以参考http://msdn.microsoft.com/zh-cn/library/aa686045.aspx 1、把DMC5480.dll放到exe程序所在的目录2、在C#里声明,例如 [DllImport("DMC5480.dll", EntryPoint = "要调用的方法名", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr 要调用的方法名(); 三个文件DMC5480.dll, DMC5480.h, DMC5480.lib是针对不同语言调用不同的库,C#只需使用DMC5480.dll文件即可 是供应商说的,他也说过只需要只需使用DMC5480.dll就可以但我不知怎么使用 跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。 跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。也就是说不能在一个类的成员方法 使用动态链接库里的函数??? 我把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' 如何解决这个错误呢? 既然那里是void那么就不需要传参数了。一般可以使用dllimport来引用非托管的dll,如果还是不行,最好找对方的API文档或者DEMO。 public static extern IntPtr d5480_board_init(void);这是凭什么写出来的? 如果C++函数的参数有"void *"类型 的话,C#里面用void * 就用IntPtr 写错了,如果C++函数的参数有"void *"类型 的话,C#里面就用IntPtr 如果是void的可以不用写现在是可以成功调用了但有些函数是d5480_get_backlash(WORD axis, long* backlash);doubleWORD *long *这些怎么写呢? 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里的一些文件是这样的 不建议这样用,会有好多问题。比如说,framework的部署问题、调用问题等等。 在那个.h文件里有这个函数public static extern IntPtr d5480_board_init();现在这样写也可以调用了,但换了有参数的就不知怎么写了 C++与C#的类型对应关系:WORD = UInt16WORD* = ref UInt16const char* = Stringdouble = doublelong * = ref Int32 // 使用 dllImport 导入。// 具体参数还需要看到底怎么使用。// 也就说,在 C++ 里面的函数除了签名之外,还需要参数契约。// 比如。[DllImport("filename.dll")]UInt32 d5480_download_firmware(UInt16 card, string filename); 贴出你的 setplusmode 的 C++ 签名和 C# 定义。 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); h和lib应该主要用在C/C++类语言调用的而C#中直接使用DLL就可以了,不需要引用(除非DLL是托管的) ,然后DLLImport声明下就可以直接使用了,只是在使用时候要主要下那些导出函数的引用方式cdecl还是std的~ 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); CallingConvention = CallingConvention.Cdecl 改成 StdCall 或者删除(缺省就是 StdCall) 。和 C++ 的 __stdcall 相对应。否则会导致堆栈不正确。 改成这样之后还是不行,Int32 or UInt32都不行,还是运行到那里就出错 如你所说删除 public static extern UInt32 d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);也第一条没有参数的函数还是可以运行,但第二条还是出现以上问题 有过Skype插件开发经验的朋友,进来帮帮忙,该马甲的第一次发贴,标题要长. 怎么把添加的引用删除 ZedGraph中的点怎么和PointPairList匹配 mapinfo地图是怎样生成的 winform DataGrid c#操作xml问题,急 在Windows操作系统下,用.NET如何获取汉字拼音的第一个字母? DevExpress 13.1.1 DateEdit 问题 怎么在GroupBox里面绘图 『StreamReader 问题..在线等,立刻给分!!!』 WPF C#怎么窗体间传值 WPF,这个渐变怎么调整
dll是确定可以调用的,而.h是C++的头文件,.lib是类库文件
从来没听说一种语言能够直接使用另一种语言编写的程序文件的
但如果是C++的类,没有很简便的方法直接调用。
使用方法:
直接添加引用是不行的,使用DLLIMPORT
可以参考
http://msdn.microsoft.com/zh-cn/library/aa686045.aspx
2、在C#里声明,例如 [DllImport("DMC5480.dll", EntryPoint = "要调用的方法名", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr 要调用的方法名();
是供应商说的,他也说过只需要只需使用DMC5480.dll就可以
但我不知怎么使用
跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。
跨语言调用动态链接库,肯定需要经过一轮转换,才能使用。直接添加引用是不行的(因为直接添加引用就能使用的dll,是符合本语言的语法编译的类库,来自第三方的dll是不能直接 被识别的),C#是使用DllImport方式调用,而且只能调用静态方法,不能使用需要类实例对象的方法。也就是说不能在一个类的成员方法 使用动态链接库里的函数???
然后在一个类中添加如下代码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'
如何解决这个错误呢?
既然那里是void那么就不需要传参数了。
一般可以使用dllimport来引用非托管的dll,如果还是不行,最好找对方的API文档或者DEMO。
这是凭什么写出来的?
现在是可以成功调用了但有些函数是
d5480_get_backlash(WORD axis, long* backlash);double
WORD *
long *
这些怎么写呢?
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里的一些文件是这样的
public static extern IntPtr d5480_board_init();
现在这样写也可以调用了,
但换了有参数的就不知怎么写了
WORD = UInt16
WORD* = ref UInt16
const char* = String
double = double
long * = ref Int32
// 具体参数还需要看到底怎么使用。
// 也就说,在 C++ 里面的函数除了签名之外,还需要参数契约。
// 比如。
[DllImport("filename.dll")]
UInt32 d5480_download_firmware(UInt16 card, string filename);
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);
而C#中直接使用DLL就可以了,不需要引用(除非DLL是托管的) ,然后DLLImport声明下就可以直接使用了,只是在使用时候要主要下那些导出函数的引用方式cdecl还是std的~
public static extern UInt32 d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);
否则会导致堆栈不正确。
如你所说删除 public static extern UInt32 d5480_set_pulse_outmode(UInt16 axis, UInt16 outmode);
也第一条没有参数的函数还是可以运行,但第二条还是出现以上问题