我目前正在实现一个自定义代码生成器,它将XML配置文件转换为Visual Studio项目中的C#类。我基本上遵循此博客文章中描述的方法:http://consultingblogs.emc.com/pauloreichert/archive/2005/05/21/1459.aspx
但是,代码生成器必须在使用生成器的程序集内查找所有可用类型及其属性。我想使用反射来做到这一点,但问题是我需要一个对程序集的引用来查找类型。
如何获得对代码生成器使用的VS项目的程序集的引用?
答案 0 :(得分:0)
请注意,为了生成程序集,Visual Studio需要编译工具输出的C#代码。因此,在您的代码生成器运行时,可能还没有程序集(如果发生这种情况则是干净的构建)。
答案 1 :(得分:0)
我找到了解决方案。实际上,可以从代码生成器中获取对Visual Studio Project对象的引用。
我在这里找到了获取项目参考的代码:http://subversion.assembla.com/svn/mistral-framework/trunk/src/VisualStudio/Mistral.VisualStudio.XmlClassGenerator/BaseCodeGeneratorWithSite.cs
然后,下面的方法返回对程序集对象的引用,我们可以通过反射来获取所有可用的类型等。
private static Assembly GetAssembly(Project project, string assemblyName)
{
Microsoft.VisualStudio.OLE.Interop.IServiceProvider oleSP =
project.DTE as Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
ServiceProvider sp = new ServiceProvider(oleSP);
DynamicTypeService dts =
sp.GetService(typeof(DynamicTypeService)) as DynamicTypeService;
Microsoft.VisualStudio.Shell.Interop.IVsSolution sln =
sp.GetService(typeof(SVsSolution)) as IVsSolution;
Microsoft.VisualStudio.Shell.Interop.IVsHierarchy hier = null;
sln.GetProjectOfUniqueName(project.UniqueName, out hier);
ITypeResolutionService rs = dts.GetTypeResolutionService(hier);
return rs.GetAssembly(new AssemblyName(assemblyName), true);
}
该方法仍然需要程序集名称,这在我的情况下很好,因为我可以从XML基本文件中读取它以进行生成。但是,我很确定你也可以在没有名字的情况下获得参考。 (当我开始工作时,我只是懒惰并停止调查; - )