• 关于dllimport的使用


    最近做一个动态加载插件的项目,插件中的dll 主要是各厂商各型号的读卡器的通用类库,stdapi.dll,WltRS.dll,有的还有进一步封装的dll,主要是为了简化通用类库的操作。

    这些类库都是用C语言,或者C++来编写的,我的项目是用C#语言编写,通过Dllimport来调用这些非托管dll的方法。

    在做这个项目的时候,由于之前的读卡器类库都是通用的,所以即时使用两款或者更多款读卡器设备,加载的都是同一类dll,不会出现问题。

    但是在开发与通用类库不兼容的插件的时候(都是读卡器插件),问题出现了。

    一:输入用户名,密码,登陆系统。

     1:该用户能使用的设备如果都是调用通用类库的读卡器,那么使用起来没有问题;

     2:该用户能使用的设备只要有一款与其他的不同,那么在切换的时候问题就出现了。

      什么问题呢?

      假如现在有两个设备,A和B,A属于可以调用通用类库的设备,B不能调用通用类库,但是有自己的一套单独的类库。

      当我启用A设备的时候,第一次执行DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”)后,那么这两个dll就会加载到内存中。

      这个时候我把A设备禁用,启用B设备,B设备也有这样的调用语句,DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”),但是B设备的这两个dll与A设备的不同,

      大家猜猜看,这个时候B设备调用的是哪一个dll??

      一开始,我以为B设备调用的是自己目录下的dll。但是经过多次试验,我发现我错了。

      只要是同名的dll,如果不指定绝对路径方式进行加载,那么第一次加载之后的所有调用语句都是调用的第一次加载的那个dll中的方法。

      所以就造成了设备使用的紊乱。但是如果这样 DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”),和DllImport(“C:\sdtapi.dll”)或者DllImport(“C:\WltRS.dll”),

      调用的却不是同一个dll,操作系统就会分别调用。我们的程序不能这样写,不然对用户的约束性就太大了。。

      针对这个问题,我的解决办法是,将各个插件目录下的文件重新命名,然后将代码中的Dllimport中的代码改成一致的名字,就OK了。

  • 相关阅读:
    编程题#2: 魔兽世界之二:装备
    程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1
    【转】C++动态创建二维数组,二维数组指针
    HDU-2571命运
    HDU-1203 I NEED A OFFER!
    HDU-1003 Max Sum
    HDU2196-Computer
    HDU-1520 Anniversary party
    ChineseHelper(获取汉字字符串的首拼)
    车牌号正则表达式(新能源车牌)
  • 原文地址:https://www.cnblogs.com/onsuccessway/p/3370257.html
Copyright © 2020-2023  润新知