gpt4 book ai didi

.net - 使用 Assembly.LoadFrom 和 Assembly.Load 混合加载程序集时的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 16:37:59 25 4
gpt4 key购买 nike

使用 Assembly.LoadFrom 混合加载程序集时的奇怪行为和 Assembly.Load :
我在使用 Assembly.LoadFrom 加载程序集时遇到了奇怪的行为然后是 Assembly.Load .
我正在使用 Assembly.LoadFrom 加载程序集,其中程序集位于文件夹中,该文件夹不是执行文件夹。
稍后在我的测试代码中,当我尝试使用 Assembly.Load 再次加载此程序集时,加载失败并返回 System.IO.FileNotFoundException (“无法加载文件或程序集...”)尽管程序集已经加载。加载失败,强名称和非强名称(再次加载此程序集的原始原因是使用 BinaryFormatter)。
但是,如果程序集位于执行文件夹中,则稍后加载在两种情况下都会成功,使用强名称和非强名称。在这种情况下,您可以看到从两个不同的位置加载了两个相同的程序集。
重现此问题的简单代码示例:

Assembly assembly1 = Assembly.LoadFrom(@"C:\a.dll");

// Loading with a strong-name fails
Assembly assembly2 = Assembly.Load(@"a, Version=1.0.0.0, Culture=neutral, PublicKeyToken=14986c3f172d1c2c");

// Also loading with a non-strong fails
Assembly assembly3 = Assembly.Load(@"a");
  • 任何解释为什么 CLR 会忽略已加载的程序集?
  • 知道如何缓解这个问题吗?
  • 最佳答案

    这并不奇怪。根据文档,使用 Load 和 LoadFrom 加载会将程序集放置在不同的上下文中。 This可能有帮助。

    1. Any explanation why the CLR ignores the already loaded assembly?


    因为他们所处的环境不同。

    1. Any idea how can I alleviate this problem?


    从相同的上下文加载,或帮助 CLR 找到程序集,也许通过将处理程序附加到 AppDomain.AssemblyResolve .

    替代

    如果您正在加载程序集的位置是 AppDomain.BaseDirectory 下的子文件夹,您只需在 App.config 中添加一个条目:
    <configuration>
    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="bin;bin2\subbin;bin3"/>
    </assemblyBinding>
    </runtime>
    </configuration>

    http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

    关于.net - 使用 Assembly.LoadFrom 和 Assembly.Load 混合加载程序集时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/416468/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com