请程序集达人帮忙解决这个棘手的问题

InterRonaldo 2010-03-03 10:57:15
不多罗嗦了 直接见问题描述:
我的程序一共有10个模块左右 结构大概如下
一个主运行模块 AppProject
几个系统共通模块 ClassLibProject
还有一些独立调用模块 ClassLibProject

现在的问题是这样的 发布目录结构如下 主运行模块和系统共通模块放在 应用程序目录下 所有的独立模块放在 应用程序下的一个Modules文件夹下

现在问题是 主程序模块调用独立模块 引用采用程序集加载模式 Assembly.LoadFile()

独立调用的模块可能有逻辑互用 采用直接引用Reference

但是问题出现了 发布应用程序是把所有独立模块放到Modules下 其余在应用程序路径 其他的程序集引用没问题 但是独立调用的模块的Reference引用则出现问题 因为总是在应用程序路径APP根目录寻找程序集 所以总是提示 "找不到文件错误"

用Fuslogvw工具查看错误程序集绑定Log如下
=== Pre-bind state information ===
LOG: User = AAA
LOG: DisplayName = Coil.FaHuoModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/Coil_SZ/SourceCode/Coil_Sln/Coil.Main/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\Coil_SZ\SourceCode\Coil_Sln\Coil.Main\bin\Debug\Coil.Main.vshost.exe.config
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.

(上网看了些资料 说是用probing 设置应用程序配置文件配置私有路径可以解决 但是在我的程序无效)

求达人多多指教,或者提供些别的思路...
...全文
197 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyuebuyu 2010-03-03
  • 打赏
  • 举报
回复
1,Assembly.Load()
这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)
使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按如下的顺序来定位程序集:
⑴如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。
⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找
⑶如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:
假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集
C:\AppDir\AssemblyName.dll
C:\AppDir\AssemblyName\AssemblyName.dll
C:\AppDir\Path1\AssemblyName.dll
C:\AppDir\Path1\AssemblyName\AssemblyName.dll
如果以上方法不能找到程序集,会发生编译错误,如果是动态加载程序集,会在运行时抛出异常!
2,Assembly.LoadFrom()
这个方法从指定的路径来加载程序集,实际上这个方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法采用上面的策略来查找程序集。如果找到了程序集,会和LoadFrom方法中指定的路径做比较,如果路径相同,该程序集 会被认为是应用程序的一部分,如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个“数据文件”来加载,不会被认为是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的执行效率高的原因。另外,由于可能把程序集作为“数据文件”来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然这个方法会加载此程序集引用的其他程序集。
3,Assembly.LoadFile()
这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!

结论:一般大家应该优先选择Load方法来加载程序集,如果遇到需要使用LoadFrom方法的时候,最好改变设计而用Load方法来代替!


用Assembly.Load()试试,Assembly.LoadFile()不会加载此程序集引用的其他程序集!,可能是嵌套引用的问题。

最好是把出错信息详细的说下
InterRonaldo 2010-03-03
  • 打赏
  • 举报
回复
谢谢楼上的意见 不过问题应该不出在LoadFrom和LoadFile这个环节 而且我试过用LoadFrom加载独立模块的话直接会出错 加载不到内容
xi_ye 2010-03-03
  • 打赏
  • 举报
回复
帮顶!!!!!!!!!!!!!!!!!
InterRonaldo 2010-03-03
  • 打赏
  • 举报
回复
非常感谢楼上兄弟的帮忙! 我总结了一下思路 的确自己对程序集和引用程序集等概念研究过浅

自己有重新检查了配置 在楼上兄弟的提示下解决了问题 可喜可贺!

首选我发现这个问题无论用LoadFrom还是Load方法均可以顺利解决问题 但是由于是Main模块加载所有的子模块而且路径是自定义的文件夹 所以一定要用probing的privatePath来指定私有路径才能确保加载成功

(这个环节使用LoadFile的话 就不用指定私有路径 所以之前的配置这部从来没出错)

但是后面的问题出现了 应该是程序集的容器里 包含了程序集,但是未加载到上下文Context,或者说引用了程序集也不没有级联确认引用的关系(也就是LoadFile导致的问题) 所以导致了子模块在互相调用时出现了引用程序集的异常

但是无论使用LoadFrom还是使用Load方法 都可以确保程序集正常加载和以后的调用使用 所以在此感谢楼上达人的指导! 也希望将这次解决问题的思路和经验分享出来。

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧