3

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

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

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

4

2 回答 2

1

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

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

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

也许你可以使用AppDomain.AssemblyLoadAssembly.ModuleResolve事件,但我怀疑。

于 2009-10-19T13:00:31.507 回答
0

利用::

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

但是您仍然必须在不同的 AppDomain 中执行此操作。

于 2010-09-06T16:36:40.017 回答