0

我正在编写一个库,给定一个程序集,它会生成一个它的依赖程序集列表 - 包括依赖项的依赖项。预期的使用场景主要包括托管代码 (.NET) 程序集。

我计算这个依赖列表的方法如下:

请注意,此帮助程序类是在引用 .NET 程序集的程序集中定义的;没有其他的。主库的程序集确实有对程序集的引用。 System.Reactive

我希望临时 AppDomain没有加载这些System.Reactive程序集,但我收到一个错误提示。

API restriction: The assembly 'file:///X:\some-path\System.Reactive.Linq.dll' has already loaded from a different location. It cannot be loaded from a new location within the same appdomain.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.ReflectionOnlyLoadFrom(String assemblyFile)
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoadFromAssemblyPath(AssemblyName assembly, FileNotFoundException originalException) in DependencyResolver\DependencyResolver.AppDomainHelper\Util\AssemblyLoader.cs:line 96
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoad(AssemblyName assembly) in DependencyResolver\DependencyResolver.AppDomainHelper\Util\AssemblyLoader.cs:line 67
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoad(AssemblyName assembly)
   at DependencyResolver.Resolver.GetAllDependenciesRecursive(AssemblyName start, Func`2 filter, Func`2 preProcess, Action`1 postProcess) in DependencyResolver\DependencyResolver\Resolver.cs:line 39
   at DependencyResolver.Resolver.<>c__DisplayClass6.<GetAllDependenciesRecursive>b__5(AssemblyName an) in DependencyResolver\DependencyResolver\Resolver.cs:line 51
   at System.Reactive.Linq.Observαble.Select`2._.OnNext(TSource value)

当我在一堆包含不同版本的System.Reactive.Linq.dll.

如何确保我的临时 AppDomain 不会加载它不需要的任何内容?

4

1 回答 1

0

一种方法是订阅的AssemblyResolve事件AppDomain并执行该方法?这样,当无法解析程序集时,将调用事件处理程序来加载程序集。这里唯一的问题是当您的程序集具有相同的文件名但不同的强名称时。

另一种方法是将所有程序集放在 的基目录中AppDomain,然后简单地调用该方法。然后检查AppDomain. 这应该为您提供您正在寻找的列表,因为CLR它将延迟加载每个程序集。只要您有具有相同文件名但不同强名称的程序集,您就可以使用私有 bin 路径。

请注意,如果您有具有相同文件名的“弱名称”程序集,您将遇到问题。

于 2013-09-18T18:30:01.303 回答