日期:2014-05-18  浏览次数:20883 次

C#调用dll文件 跪求L
文件一共有三个:dcrf32.dll、dcrf32.h、dcrf32.lib
如果是VC++的人员编程的话就把dcrf32.lib加入到工程>设置 链接功能块就行了,他们就可以编其他功能了
可是小弟我只会编VC#。


下面是一些代码,我来请教各位大侠、高手们!!!
头文件dcrf32.h里:
#define uc unsigned char
extern "C"
{
//1.
HANDLE __stdcall dc_init(__int16 port,long baud);//链接串口
//2.
__int16 __stdcall dc_exit(HANDLE icdev);
//3.
__int16 __stdcall dc_config(HANDLE icdev,unsigned char _Mode,unsigned char _Baud);

... ...
解释一下:int dc_init(int port,long baud);

功 能:初始化通讯口

参 数:port:取值为0~19时,表示串口1~20;为100时,表示USB口通讯,此时波特率无效。

  baud:为通讯波特率9600~115200

返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表

  例:int icdev;

  icdev=dc_init(0,9600);//初始化串口1,波特率9600


----------------------------------------------------

dcrf32.dll文件没打开过。

我用C#调用,用以下方发会出现异常(“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”)。但开始没有语法错误的
  [DllImport("dcrf32.dll")]
  public static extern IntPtr dc_init(int port, long baud);

  private void button1_Click(object sender, EventArgs e)
  {
  IntPtr re = dc_init(100, 0);//按按钮“链接串口”的时候出错了<-这句出错:试图加载格式不正确的程序。
  }


请大家指教。

------解决方案--------------------
int16就是int16,c语言的int和long都是int32
c#的long好像是int64了吧
------解决方案--------------------
public static extern IntPtr dc_init(int port, long baud);
上面是_int16这里用int肯定不对,用short port试试
------解决方案--------------------
extern "C"
{
//1.
HANDLE __stdcall dc_init(__int16 port,long baud);//链接串口
//2.
__int16 __stdcall dc_exit(HANDLE icdev);
//3.
__int16 __stdcall dc_config(HANDLE icdev,unsigned char _Mode,unsigned char _Baud);

... ...
解释一下:int dc_init(int port,long baud);


_int16 = short
unsigned char = byte
long = int
HANDLE = IntPtr

 再试。
记得用GetLastErr()

------解决方案--------------------
[DllImport("dcrf32.dll")]
public static extern IntPtr dc_init(int port, long baud);

应该把long该成int就行
一个参数最少也得4字节,虽然那边要的是__int16,但还是占用4个字节,你传4个字节过去也不会出错
而c语言long要4个字节,c# long是8个字节
------解决方案--------------------
可能程序的32位和服务器的版本可能不一样。
参考
------解决方案--------------------
楼主把dll复制到生成目录里
就是\bin\debug\
------解决方案--------------------
[DllImport("dcrf32.dll")]
 然后在方法上加上extern关键字
------解决方案--------------------
//---------------------------------------------
[DllImport("dcrf32.dll", EntryPoint = "dc_init")]
//说明:初始化
public static extern int dc_init(Int16 port, long baud); //初试化

[DllImport("dcrf32.dll", EntryPoint = "dc_exit")]
//说明:关闭读写模块
public static extern short dc_exit(int icdev);

[DllImport("dcrf32.dll", EntryPoint = "dc_reset")]
//说明:重置读写模块一段时间
public static extern short dc_reset(int icdev, uint sec);

[DllImport("dcrf32.dll", EntryPoint = "dc_request")]
//说明:寻卡
public static extern short dc_request(int icdev, char _Mode, ref uint TagType);

[DllImport("dcrf32.dll", EntryPoint = "dc_card")]
//说明:获得卡芯片号