如何从System.Type获取相应的MonoDevelop.Projects.Dom.IType?

时间:2010-12-24 13:15:50

标签: types mono assemblies add-in monodevelop

我正在尝试做问题标题中描述的内容。 要做到这一点,我发现只有一种方法,但id没有给我预期的结果。

我执行以下操作:

System.Type type = ...; //known System.Type instance;
var dom = ProjectDomService.GetAssemblyDom(project.TargetRuntime, type.Assembly.FullName);

之后(正如我所料)dom.Types应包含所有已导出的程序集,但它是空的;

有没有办法从Type中获取IType?

UPD :(已解决)

这里有助于获取正确的AssemblyDom实例然后按名称获取IType的代码:

string assemblyName = targetRuntime.AssemblyContext
                        .GetAssemblyNameForVersion(type.Assembly.FullName, targetFramework);

var assemblyLocation = targetRuntime.AssemblyContext
            .GetAssemblyLocation(assemblyName, targetFramework);

var assemblyDom = ProjectDomService.GetAssemblyDom(targetRuntime, assemblyLocation);

var t = assemblyDom.GetType(type.FullName);

1 个答案:

答案 0 :(得分:1)

尽管有参数名称,我认为 GetAssemblyDom的第二个参数是程序集文件路径,而不是程序集名称。 (即使它可以解析程序集名称,对于目标运行时中的系统程序集或程序包也是如此。)

没有从System.Type到IType的简单查找的原因是它几乎从不需要。 IType的目的是避免加载程序集和实际类型,因为它们无法卸载,并且无法从不同的框架或程序集加载类型。因此,处理常规IT类型的代码永远不应该处理常规类型。

IType也提高了内存效率 - ProjectDom程序集数据库具有有助于快速完成代码的索引,并允许信息可以延迟加载,然后以细粒度方式卸载。