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#

解决方案 »

  1.   

    这样的情况你最好找到原有vc的项目生成这个dll的项目源码,能知道引用了哪些dll,然后凑齐dll都引用到现有项目中应该才能没问题。这就像有项目使用了水晶报表,最后生成了dll,但是如果你又在别的项目里引用了,丢失了原有的水晶报表的dll就当前不可用了。只能追溯。
      

  2.   

    有可能dll导出函数的名字被扰动了(name mangling)。
    可以用以下命令行确认:
    dumpbin.exe /EXPORTS 你dll的名字.dll
      

  3.   


    这个命令在哪里执行呢,我不会C#,动态库是我用vc写的?
    如果被扰动了,该怎么解决呢?
      

  4.   


    知道LoadLibrary、GetProAddress、FreeLibrary在MFC哪个库里吗
      

  5.   

    有必要吗?
    可以直接用[DllImport("yourdll")]
      

  6.   

    有必要吗?
    可以直接用[DllImport("yourdll")]上面我说的方法是在网上查的。
    你是说C#可以直接用[DllImport("xx.dll")]来引用动态库?
      

  7.   

    我给你几个建议:
    1、你安装一下.net2.0环境。
    2、如果安装后不行,在看你在使用C++封装dll是使用的是动态加载还是静态的,如果是动态的看你C++代码中dll加载的位置是否有此dll。
      

  8.   

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

  9.   

    [DllImport("kernel32.dll")]
    public extern static IntPtr LoadLibrary(String path);[DllImport("kernel32.dll")]
    public extern static IntPtr GetProcAddress(IntPtr lib, String funcName);[DllImport("kernel32.dll")]
    public extern static bool FreeLibrary(IntPtr lib);或者直接用:[DllImport("自定义库.dll")]
    方法原型参考:http://blog.csdn.net/jame_peng/article/details/4387906
      

  10.   

    如果是dll依赖性的话,10楼讲得很清楚了LoadLibrary/GetProcAddress/FreeLibrary在Kernel32.dll中