我目前正在实现一个自定义代码生成器,它在一个Visual Studio项目中将XML配置文件转换为C#类。我基本上遵循了这篇博文中描述的方法:http://consultingblogs.emc.com/pauloreichert/archive/2005/05/21/1459.aspx
但是,代码生成器必须在使用生成器的程序集中查找所有可用的类型及其属性。我想使用反射来实现这一点,但问题是我需要一个对在其中查找类型的程序集的引用。
我如何获得代码生成器所在的VS项目的程序集的引用?
发布于 2010-11-08 06:56:37
我找到了一个解决方案。实际上,可以从代码生成器中获取对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基本文件中读取它来生成。但是,我非常确定您也可以在没有名称的情况下获得引用。(我只是懒惰,当我让它工作的时候停止了调查;-)
发布于 2010-11-05 04:12:18
请注意,为了生成程序集,Visual Studio需要编译工具输出的C#代码。因此,在代码生成器运行时,可能还没有程序集(如果这种情况发生在干净的构建中)。
https://stackoverflow.com/questions/4103504
复制