Assembly.Load(Byte [])和Assembly.Location / Assembly.Codebase

时间:2009-10-19 12:44:15

标签: .net codebase assembly.load

我正在尝试加载程序集而不锁定文件。这些程序集可能是第三方程序集,因此我们不一定能访问代码,其中一个或两个使用Assembly.Location从其目录中读取文件,这些文件可能依赖于这些文件。

我知道你可以通过Shadow Copying来做到这一点,但让它正常工作真是太痛苦了,某些论坛上的几个用户建议将程序集加载到一个字节数组中并使用Assembly.Load(Byte [])超载。这很有效,直到其中一个程序集尝试访问其父目录中的文件,因为Assembly.Location返回一个空字符串,而Assembly.Codebase返回加载程序集的应用程序的位置。

我能以某种方式设置我正在加载的程序集的Codebase或Location属性吗?在Codebase和Location的MSDN文档中,它们被定义为可覆盖的属性 - 这是否意味着我可以从托管应用程序覆盖它们?

2 个答案:

答案 0 :(得分:1)

您可以使用AppDomainSetup.ApplicationBase吗?或者您是否需要为加载的每个程序集定义该路径?

编辑:使用文件名很容易定义代码库:

AssemblyName assemblyRef = new AssemblyName();
assemblyRef.CodeBase = assemblyFile;
Assembly assembly = Assembly.Load(assemblyRef);

也许您可以使用AppDomain.AssemblyLoadAssembly.ModuleResolve事件,但我对此表示怀疑。

答案 1 :(得分:0)

使用::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

但你仍然需要在不同的AppDomain中执行此操作。