如何解决为什么 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 举报,一经查实,本站将立刻删除。