为什么 Assembly.LoadFrom 表现不同?

问题描述

我在 .NET Framework 4.7.2 上运行此代码

static void test()
{
    Console.WriteLine("--1--");
    LogallLoadedAssemblies();

    Console.WriteLine("--2--");
    var loaded = Assembly.LoadFrom("C:/MyLib/1_1_0/MyLib.dll");
    Console.WriteLine(AssemblyToString(loaded));

    Console.WriteLine("--3--");
    LogallLoadedAssemblies();
}

static void LogallLoadedAssemblies()
{
    foreach(var str in AppDomain.CurrentDomain.GetAssemblies().Select(AssemblyToString))
        Console.WriteLine(str);
}

static string AssemblyToString(Assembly a)
{
    return $"{a.FullName},loc: {a.Location},ctxt:{a.HostContext}";
}

方法 Test 运行时,我在我的 PC (Windows) 和 TeamCity 构建代理 (Mac OS X) 上得到了 2 个不同的结果:

我的PC (Windows)

--1--
MyLib,Version=2.2.0.0,Culture=neutral,PublicKeyToken=null,loc: C:\MyLib\2_2_0\MyLib.dll,ctxt:0
--2--
MyLib,Version=1.1.0.0,loc: C:\MyLib\1_1_0\MyLib.dll,ctxt:0
--3--
MyLib,ctxt:0
MyLib,ctxt:0

TeamCity 构建代理 (Mac OS X)

--1--
MyLib,ctxt:0

所以,在第一种情况下,LoadForm 确实加载了程序集,我问,不管 2.2.0 版本。此库的已加载。

在第二种情况下,它忽略了我的查询并给了我已经加载的程序集。 为什么行为不同?

我在试图找出造成这种差异的原因的过程中做了什么:

我找到了[here]

LoadFrom 方法有以下缺点。考虑改用 Load。

  • 如果已经加载了具有相同标识的程序集,即使指定了不同的路径,LoadFrom 也会返回已加载的程序集。

//此处的“身份”是什么意思? UPD: 评论说“身份”表示程序集名称、版本、文化和公钥令牌

但为什么在我的 PC 上(第一种情况)此规则不起作用?

我已经对加载的程序集的一些可能的不同上下文感到担忧。但是我知道,我在 .HostContext 见过的所有程序集中的 AppDomain.CurrentDomain.GetAssemblies() 始终是 0。因此,无论“context”代表什么,在这两种情况下,所有程序集看起来都是一样的,并且可能无法回答我的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)