Winform程序,在debug文件夹下新建文件夹Library,放入第三方类库文件,添加引用的时候“复制到本地”必须选True才能正常运行,选False提示找不到类库文件。也就是说必须放到debug根目录才能正常使用,放到Library,文件夹下无法正常运行。

解决方案 »

  1.   

    这是windows的规则
    Windows搜索DLL文件的基本规则: 1)执行文件所在的文件夹。 2)windows系统安装文件夹,即安装了windows的文件夹,GetWindowsDirectory( )函数可提供该目录的路径名。 3)Windows系统目录,即System32子目录;调用GetSystemDiretory( )函数可获得这个目录的路径名。 4)在系统变量Path中配置的文件夹,或用dos的path命令指定的文件夹。 5)网络中映象的目录列表中的全部目录。
      

  2.   

    像QQ、迅雷等等软件是如何做的呢,他们的程序文件都是分类放在不同的文件夹下的,现在我的主程序跟类库文件,xml文件等等全在debug根目录,感觉太乱了,想分类管理,如何实现呢?
      

  3.   

    假如动态库是非托管的,就要LoadLibrary和GetProcAddress了……
      

  4.   

    你可以在打包程序的时候,把Dll文件作为资源打包到.exe文件中去,这样你发布程序给别人的时候,就不用带DLL了,也不用在debug下包含该DLL文件,
    参考:
    http://www.cnblogs.com/yanbinboy/archive/2008/05/12/1193039.html
    http://www.cnblogs.com/zengxlf/archive/2009/05/17/1458996.html
      

  5.   

    非托管库,考虑使用
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool SetDllDirectory(string lpPathName);托管库请扔GAC
      

  6.   

    可以啊,反射啊,因为你的动态库不在windows搜索的路径里面
      

  7.   

    关于反射,可以说的明白些吗,我在网上找到反射的例子,试着测试,结果如下:
    使用Assembly t = Assembly.LoadFrom(@"D:\Lib\Webtest.dll"); 
    或者Assembly t = Assembly.LoadFile(Environment.CurrentDirectory + @"\Lib\Webtest.dll"); 
    确实可以实现动态加载dll文件,但是没达到我预想的效果,如果添加引用的时候“复制到本地”选择为“false”还是会出错,选择为“true”则运行正常,不过这样就会复制到Debug根目录下,这样就违背了我的初衷了,我是想就把dll文件放到Debug下的子文件夹Lib里,经过多次测试还是无法解决问题。
    求大神来帮忙啊!
      

  8.   

    最简单的方法,在你的项目下创建相关文件夹,然后把dll拷贝进去,然后项目“查看所有文件”,然后包含该文件夹,然后引用,然后复制到本地。然后就没有然后了。
      

  9.   


    那这个复制就没有什么用了,他引用的还是跟目录下的那个dll文件