我正在尝试使用Reflection完成(似乎是)一个非常简单的.NET依赖注入机制。目标是为ServiceFactory类提供一个接口,并使用反射来确定该接口的可用实现者的范围,并选择基于App.config部分的实现。听起来很简单。
我选择的路由是使用每个服务实现项目的post-build事件将实现.dll复制到“ServiceImplementations”文件夹中。然后,ServiceFactory类在此文件夹中查找以查找可用的,有效的接口实现者。我的想法是,使用反射,我应该能够在运行时纯粹在反射中加载这个任意DLL及其所有依赖项。这是我希望实现的目标。
在整个过程中,我正在加载这些依赖项。我可以检查我当前加载的程序集 var asmDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies()
所以我继续进行Reflection抓取,最后加载依赖程序集(在本例中是EntityFramework,通过NuGet加载,System.Web.ApplicationServices,系统文件)。一切都很好。直到我达到这行代码:
var serviceImplementationAssembly = CheckLoadedAssemblies(assemblyName); // This function loads the service implementation assembly and its dependencies
var appDomainAsm = AppDomain.CurrentDomain.GetAssemblies();
var implementationTypes = serviceImplementationNamespace.GetTypes(); // Exception here
在最后一行代码中,抛出一个ReflectionTypeLoadException。此异常包含两个LoaderExceptions(每个都是FileNotFoundException),并带有消息:
Could not load file or assembly 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.":"EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
这很奇怪。如果我检查上面的asmDomainAsm变量,我可以看到在我当前的AppDomain中加载了精确的程序集签名 。我不明白为什么Reflection不会认识到这些是相同的程序集,即使我在不同的时间加载它们。
提前感谢您的帮助。
答案 0 :(得分:1)
我终于开始工作了。本质上,我试图通过加载每个程序集,检查其依赖项,并随时解雇Assembly.Load和Assembly.LoadFile事件来手动处理AssemblyResolve事件。当我添加一个CurrentDomain_AssemblyResolve事件时,当被触发时,运行我的自定义目录搜索/汇编加载代码,一切正常。
由于某些内部AppDomain / BundleContext问题,引发了异常。切换到AssemblyResolve修复了我的问题。不幸的是,这就是我所知道的事情。如果有人能解释这里的内容,我会接受答案。