问题描述
我在 .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 (将#修改为@)