【发布时间】:2017-02-28 13:36:38
【问题描述】:
我见过几个类似的问题,但没有一个能解决我的问题。场景是 - 我在外部存储中有几个 DLL,我需要获取有关它们的信息(具体而言,Assembly 版本和 AssemblyInformationalVersion)。我从以下代码开始:
List<byte[]> assemblies = _client.DownloadAllAssemblies();
foreach(var assemblyBytes in assemblies)
{
var assembly = Assembly.ReflectionOnlyLoad(assemblyBytes);
var assemblyName = assembly.GetName();
... // read version from assembly name
}
以上代码只能运行一次。如果我单击一个按钮来刷新视图 - 它会引发异常,说明程序集已加载并且无法重新加载它。然后我读到我应该创建临时域并将程序集加载到其中,这样我就可以在完成后卸载 AppDomain。我尝试了以下代码:
List<byte[]> assemblies = _client.DownloadAllAssemblies();
var tempDomain = AppDomain.Create("TemporaryDomain");
foreach(var assemblyBytes in assemblies)
{
var assembly = tempDomain.Load(assemblyBytes);
var assemblyName = assembly.GetName();
... // read version from assembly name
}
AppDomain.Unload(tempDomain);
以上代码抛出 FileNotFound 异常,提示“无法加载文件或程序集...”
我明白为什么会这样,但我不知道如何解决这个问题。这项任务似乎很琐碎:
- 加载文件,
- 阅读其版本,
- 算了。
上述逻辑没有什么复杂的。运行时要求似乎过于复杂。有谁知道我怎样才能让它工作?
【问题讨论】:
-
需要更多的堆栈跟踪(始终提供完整的信息),在完成加载您传入的任何字节数组之前,可能无法加载依赖程序集。
AppDomain上有一些属性您应该从默认值复制,例如探测路径。此外,您仍然想使用ReflectionOnlyLoad它不会尝试解决所有问题。 -
@escape-llc AppDomain 不公开“ReflectionOnlyLoad”功能。稍后我将使用 StackTrace 更新问题。谢谢。
标签: c# .net .net-assembly appdomain