我正在为自己编写一个实用工具,部分原因是为了学习C#Reflection,这部分是因为我实际上想要自己使用的结果工具.
我所追求的是基本上将应用程序指向一个程序集并选择一个给定的类,从中选择应作为字段包含在导出的HTML表单中的属性.然后,该表单将在我的ASP.NET MVC应用程序中用作View的开头.
由于我正在将Subsonic对象用于我想要使用的应用程序,这应该是合理的,我想通过想要根据数据类型包含不同输出HTML之类的东西,Reflection就是完成这项工作的方法.
然而,我正在寻找的东西似乎难以捉摸.我正在尝试将通过OpenFileDialog选择的DLL/EXE作为起点并加载它:
String FilePath = Path.GetDirectoryName(FileName); System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);
这工作正常,但由于Subsonic生成的对象实际上充满了在Subsonic.dll等中定义的对象类型,因此不会加载这些依赖对象.输入:
AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();
这也包含了我所期望的内容.但是,我想弄清楚的是如何加载这些程序集,以便我挖掘到我的对象将正常工作.我理解,如果这些程序集在GAC或正在运行的可执行文件的目录中,我可以按名称加载它们,但是这个用例不太可能是这种情况,这是我的主要用例.
因此,它归结为如何加载给定的程序集及其所有任意程序集以文件名开头,并生成一个完全反射可浏览的类型,属性,方法等树.
我知道像Reflector这样的工具可以做到这一点,我找不到获取它的语法.
几个选项在这里:
根据请求的程序集附加AppDomain.AssemblyResolve
并执行另一个LoadFile
程序.
AppDomain
以目录为基础启动另一个并在其中加载程序集AppDomain
.
我强烈建议继续使用选项2,因为这可能会更清晰,并允许您卸载所有这些组件.另外,如果只需要反映它们,请考虑在仅反射上下文中加载程序集(请参阅参考资料Assembly.ReflectionOnlyLoad
).