不多罗嗦了 直接见问题描述:
我的程序一共有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 设置应用程序配置文件配置私有路径可以解决 但是在我的程序无效)求达人多多指教,或者提供些别的思路...
我的程序一共有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 设置应用程序配置文件配置私有路径可以解决 但是在我的程序无效)求达人多多指教,或者提供些别的思路...
这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用 这个方法,他的执行效率比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()不会加载此程序集引用的其他程序集!,可能是嵌套引用的问题。最好是把出错信息详细的说下