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

发布于 2024-08-08 09:29:29 字数 394 浏览 5 评论 0原文

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

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

我可以做些什么来以某种方式设置我正在加载的程序集的代码库或位置属性吗?在代码库和位置的 MSDN 文档中,它们被定义为可重写的属性 - 这是否意味着我可以从托管应用程序重写它们?

I'm trying to load an assembly without locking the file. These assemblies could be third party assemblies so we don't necessarily have access to the code and one or two of them make use of Assembly.Location to read files from their directory, files they might depend on.

I'm aware you can do this via Shadow Copying but it's a real pain getting it to work properly and several users on certain forums have recommended loading the assembly into a byte array and using the Assembly.Load(Byte[]) overload. This works great until one of those assemblies tries to access a file in its parent directory because Assembly.Location returns an empty string and Assembly.Codebase returns the location of the application loading the assembly.

Is there anything I can do to somehow set the Codebase or Location properties of the assembly I'm loading? In the MSDN documentation for Codebase and Location they're defined as overridable properties - does that mean I can override them from the hosting application?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2024-08-15 09:29:29

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

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

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

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

Can you use AppDomainSetup.ApplicationBase ? Or do you need to define that path for every assembly you load?

EDIT: using a filename is easy to define a codebase:

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

Maybe you could use AppDomain.AssemblyLoad or Assembly.ModuleResolve events, but I doubt.

羁拥 2024-08-15 09:29:29

use::

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

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

use::

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

But you would still have to do this in a different AppDomain.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文