日期:2014-05-17  浏览次数:20954 次

C Sharp调用vc6.0写的动态库问题
vc动态库设计方式:建立工程的时候在向导里面选择的是Regular DLL with MFC Statically linked,
                  把一个设备动态库重新封装成一个新的动态库,以实现多个功能,方便调用。

C#调用重新封装动态库的方式:C#封装C++API函数LoadLibrary、GetProAddress、FreeLibrary函数为C#方法;C#再用这三个函数调用重新封装的动态库函数。

出现的问题:C#在测试调用重新封装的动态库时,提示“找不到相应的动态库模块”。            
                本机安装VC6.0环境后,可以正常调用重新封装动态库里的接口函数。

请问该如何解决这个问题(在不安装vc6的前提下)?我能想到的原因是:
1、由于写动态库的时候选择的是常规DLL,用到了MFC类库,所以在没有vc环境的机器上测试调用的时候缺少这些库?如果是这个原因,又不知道缺少的是哪些库。

请大神们不吝赐教。
MFC 动态库 C#

------解决方案--------------------
这样的情况你最好找到原有vc的项目生成这个dll的项目源码,能知道引用了哪些dll,然后凑齐dll都引用到现有项目中应该才能没问题。这就像有项目使用了水晶报表,最后生成了dll,但是如果你又在别的项目里引用了,丢失了原有的水晶报表的dll就当前不可用了。。。。只能追溯。
------解决方案--------------------
有可能dll导出函数的名字被扰动了(name mangling)。
可以用以下命令行确认:
dumpbin.exe /EXPORTS 你dll的名字.dll
------解决方案--------------------
我给你几个建议:
1、你安装一下.net2.0环境。
2、如果安装后不行,在看你在使用C++封装dll是使用的是动态加载还是静态的,如果是动态的看你C++代码中dll加载的位置是否有此dll。

------解决方案--------------------
1. 可以测试机子(没有VC环境)上用depends 看看,是否存在缺少dll。(一般情况下,如果使用过mfc类库的话,缺少的是mfcxx.dll)。
2.如果depends 结果一切正常的话,需要看下程序中是否存在 动态调用的链接库(例如loadlibrary).如果有的话,记住引用的动态链接库名称。在c# code中pinvoke 调用setdlldirectory方法(通常是一起打包到程序目录下),loadlibrary 一般默认最先在当前module目录下找寻引用到的链接库。
------解决方案--------------------
如果是dll依赖性的话,10楼讲得很清楚了

LoadLibrary/GetProcAddress/FreeLibrary在Kernel32.dll中