我见过几个类似的问题,但没有解决我的问题。场景是 - 我有外部存储器中的几个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异常说“无法加载文件或程序......”
我明白为什么它正在发生,但我不知道如何来解决此。任务似乎很简单:
- 加载文件,
- 阅读它的版本,
- 忘掉它。
上面的逻辑没有什么复杂的。看起来像运行时需求过于复杂。有谁知道我怎么能使它工作?
需要更多的堆栈跟踪(总是提供完整的信息)有可能在加载任何传入的字节数组之前,依赖程序集无法加载。您应从“应用程序域”复制某些属性默认,如探测路径。你还想使用'ReflectionOnlyLoad',它不会试图解决所有问题。 –
@ escape-llc AppDomain不公开“ReflectionOnlyLoad”函数。稍后我会用StackTrace更新问题。谢谢。 – MajkeloDev