none
引用程序集位置的问题 RRS feed

  • 问题

  • 我有两个程序集A和B,A在运行时使用反射动态加载B,A和B不在同一个文件夹中。

    但B在设计时引用了几个程序集,是同B在同一路径下的。

    现在因为A动态加载的B,导致B的工作路径变为与A一样,也就是B在加载其引用的程序集时会去搜索A所在的文件夹,而是不B自己文件所在的文件夹。

     

    如何才能让B在被加载后,搜索自己文件所在的文件夹而不是A的呢?

    因为某些原因,B引用的那些DLL不便放置在系统目录中

    2011年7月22日 14:52

答案

全部回复

  • dear

    你可以设定组件安装的设定挡

    http://www.dotblogs.com.tw/yc421206/archive/2009/04/16/8030.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月22日 15:35
  • 感谢回复,但却没有实际解决我的问题。

    设定档的方法仍是需要进行配置,而我说的B这程序集实际上是多个分布在不同文件夹中的。

    2011年7月23日 5:37
  • dear

    不用配置挡案应该是没办法告诉软体要去哪里抓资料,GAC 也是用配置挡处理的,比如说你要处理一个文件也是需要写源码,告知软体路径,路径要写的灵活当然就是用配置挡,如果写死在源码里当路径一变,专案又得重新编译,需要重新编译的专案表示写的不够灵活


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月23日 5:52
  • 被加载的程序集文件路径是不固定的,加载方(A)是使用反射在运行时去搜索需要加载的程序集的(这些程序集都放在一个目录下,但可能在不同的子文件夹中)。

    而B加载的程序集都是在设计时引用的,与B在同一文件夹中。

    我所需要的是让B能够去自己所在文件夹中查找引用的程序集(这在通常情况下是很平凡的),而不会因为是A加载的B,就导致B去A所在的文件夹中查找所引用的程序集。

     

    所以困扰我的是,B所引用的程序集全部都要放在A所在的文件夹中(或系统目录中),这样不仅会使A所在的文件夹里很乱,更可能导致不同的B引用了不同版本的同一程序集,进而互相覆盖

    2011年7月23日 6:17
  • dear

    把配置挡案想成是参数的设定挡案,只需要在里面记录你想要反射的挡案路径即可


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月24日 2:45
  • 程序集是怎么样被动态加载的?同一个 AppDomain?

    如果使用 Assembly.Load, LoadFile 等方法加载,那么动态程序集的 Working Directory 就和主程序集一致,也就是上面说的 A 的目录,B 的依赖引用当然会去从 A 的目录找了。不过,可以通过 app.config 的 assemblyBinding 的 probe 节点增加目录,以便 CLR 在这些额外的目录中寻找依赖项。但是,您说加载的目录可能是动态的。。。那么,就只能把动态程序集都加载到另一个 AppDomain 中去了。

    加载到另一个 AppDomain 后,设置其 WorkingDirectory 到特定目录就可以解决依赖项找不到的问题。不过,您要考虑将程序集加载到另一个 AppDomain 的问题,比如类型跨域,您需要考虑到底是 By Value 还是 By Marshal Ref。


    Mark Zhou
    2011年7月26日 7:20
  • 我也想过这么做,但是这就需要给每一个被加载的程序集一个AppDomain,先不说效率如何,功能的相互调用也十分麻烦。

    这个问题困扰我好久了,哎……

    2011年7月26日 14:23
  • 被加载的程序集文件路径是不固定的,加载方(A)是使用反射在运行时去搜索需要加载的程序集的(这些程序集都放在一个目录下,但可能在不同的子文件夹中)。

    而B加载的程序集都是在设计时引用的,与B在同一文件夹中。

    我所需要的是让B能够去自己所在文件夹中查找引用的程序集(这在通常情况下是很平凡的),而不会因为是A加载的B,就导致B去A所在的文件夹中查找所引用的程序集。

     

    所以困扰我的是,B所引用的程序集全部都要放在A所在的文件夹中(或系统目录中),这样不仅会使A所在的文件夹里很乱,更可能导致不同的B引用了不同版本的同一程序集,进而互相覆盖


    在设计B的时候,加载的那些程序集指定它们的路径,也不行吗?
    Lucky Dog
    2011年7月27日 9:23
  • B类程序集不全是我设计开发的,而且B的程序位置都是相对于A的,而A又不一定被安装到什么位置。

    2011年7月29日 12:10
  • Hi~

    請先參考這篇: http://www.dotblogs.com.tw/nobel12/archive/2011/07/27/32162.aspx

    此時,您把你所謂的工作路徑變數 ( 假定為 WorkPath ) 在 B類中再宣告使用時改為

    new string WrokPath = "C:\\.......";

    用這樣的方式試試看。

    或許是A類在設計上的問題,導致讓你在B類上發生這樣一個情況,

    但使用關鍵字 new 請 **小心使用** ,不然容易造成您程式架構 / 邏輯等問題喔!


    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2011年7月30日 9:20
  • 感谢回复。

    这个方法我也考虑过,但B所引用的程序集不一定在何时加载,同时多个B类程序集可能会同时在运行,单一工作路径便无法满足。

    现在唯一的解决方法就是为每一个B创建一个AppDomain,但其效率何如先不说,跨域调用也很麻烦。

     

    实际B所引用的程序集全部放在A目录也不是不行,只是我担心同名但不同版本的程序集会互相覆盖,导致部分B程序无法运行

    2011年7月31日 16:06
  •  

    添加引用的时候可以设置dll 的属性,设置 Copy Local = false,试试看。

    GAC和.NET 的一些程序都是用这个属性来限制dll copy到 同一个目录下的。

    http://msdn.microsoft.com/zh-cn/library/yf1d93sz.aspx

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月1日 6:11
    版主
  • B类程序引用的dll一般都是在程序发布后释放进去的,所以无法在开发时预测是否存在重名但不同版本的dll
    2011年8月2日 15:06
  • 现在唯一的解决方法就是为每一个B创建一个AppDomain

    就目前来看,就这一个方法了。 让我们期待微软的更新技术吧。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月3日 3:11
    版主
    • 已标记为答案 Bunliney 2011年8月15日 8:31
    2011年8月5日 1:21
    版主
  • 试了一下AppDomain.AssemblyResolve事件,实现起来还算不错,只是无法知道是哪个加载的程序集在加载程序集时索引不到,无法具体定位到该程序集文件夹内进行加载,只能查找所有符合要求的位置路径的同名的程序集
    2011年8月7日 7:41
  • 这样看来,就只能把引用的程序集放在同一个文件夹下或者GAC中了。
    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月8日 2:34
    版主