我正在为自己编写一个实用程序,一方面是为了学习C#反射,另一方面是因为我实际上需要这个工具。
我的目的是将应用程序指向一个程序集,并选择一个给定的类来选择要作为字段包含在导出的HTML表单中的属性。该表单将被用作ASP.NET MVC应用程序中视图的开头。
由于我想在使用Subsonic对象的应用程序中使用它,因此这应该是合理的。我认为,通过想要包括诸如根据数据类型不同的输出HTML之类的内容,反射是完成此任务的方法。
然而,我正在寻找的东西似乎很难找到。我正在尝试以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这样的工具可以实现这一点,我只是找不到使用语法。