首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#调用dll文件 跪求L,该怎么解决

2013-10-17 
C#调用dll文件跪求L文件一共有三个:dcrf32.dll、dcrf32.h、dcrf32.lib如果是VC++的人员编程的话就把dcrf32.l

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")]
        //说明:获得卡芯片号
        public static extern short dc_card(int icdev, char _Mode, ref ulong Snr);



        [DllImport("dcrf32.dll", EntryPoint = "dc_halt")]
        //说明:关闭与当前卡的通讯
        public static extern int dc_halt(int icdev);

        [DllImport("dcrf32.dll", EntryPoint = "dc_anticoll")]
        //说明:锁定卡,返回芯片号
        public static extern short dc_anticoll(int icdev, char _Bcnt, ref int IcCardNo);

        [DllImport("dcrf32.dll", EntryPoint = "dc_beep")]
        //说明:蜂鸣
        public static extern short dc_beep(int icdev, uint _Msec);

        [DllImport("dcrf32.dll")]
        //说明:验证密钥
        public static extern short dc_authentication(int icdev, Int16 _Mode, Int16 _SecNr);

        [DllImport("dcrf32.dll", EntryPoint = "dc_load_key")]
        public static extern short dc_load_key(int icdev, int mode, int secnr, [In] byte[] nkey);  //密码装载到读写模块中


        [DllImport("dcrf32.dll", EntryPoint = "dc_load_key_hex")]
        public static extern short dc_load_key_hex(int icdev, int mode, int secnr, string nkey);  //密码装载到读写模块中

        [DllImport("dcrf32.dll", EntryPoint = "dc_write")]
        public static extern short dc_write(int icdev, int adr, [In] byte[] sdata);  //向卡中写入数据

        [DllImport("dcrf32.dll", EntryPoint = "dc_write")]
        public static extern short dc_write(int icdev, int adr, [In] string sdata);  //向卡中写入数据

        [DllImport("dcrf32.dll", EntryPoint = "dc_write_hex")]
        public static extern short dc_write_hex(int icdev, int adr, [In] string sdata);  //向卡中写入数据(转换为16进制)

        [DllImport("dcrf32.dll", EntryPoint = "dc_read")]
        public static extern short dc_read(int icdev, int adr, [Out] byte[] sdata);

        [DllImport("dcrf32.dll", EntryPoint = "dc_read")]
        public static extern short dc_read(int icdev, int adr, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sdata);  //从卡中读数据
        [DllImport("dcrf32.dll", EntryPoint = "dc_read_hex")]
        public static extern short dc_read_hex(int icdev, int adr, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sdata);  //从卡中读数据(转换为16进制)



        [DllImport("dcrf32.dll", EntryPoint = "a_hex")]
        public static extern int a_hex(string oldValue, ref string newValue, Int16 len);  //普通字符转换成十六进制字符
        [DllImport("dcrf32.dll", EntryPoint = "hex_a")]
        public static extern void hex_a(ref string oldValue, ref string newValue, int len);  //十六进制字符转换成普通字符

        [DllImport("dcrf32.dll", EntryPoint = "dc_changeb3")]
        public static extern short dc_changeb3(int icdev, int _SecNr, byte[] _KeyA, int _B0, int _B1, int _B2, int _B3, int _Bk, byte[] _KeyB);  //十六进制字符转换成普通字符

        [DllImport("dcrf32.dll", EntryPoint = "dc_select")]
        public static extern short dc_select(int icdev, int _Snr, ref uint _Size);  //十六进制字符转换成普通字符



楼主你试下吧,这是我以前做的项目里用到的类,我都用过,应该可以的
[解决办法]

引用:
这位大侠,谢谢了。。。我都快哭了,这几天憋得我呀。。。
引用:

可能程序的32位和服务器的版本可能不一样。
参考

你解决了?

热点排行