2010-11-05 93 views
0

我目前正在實現一個自定義代碼生成器,它將XML配置文件轉換爲Visual Studio項目中的C#類。我基本上遵循本博客文章中描述的方法:http://consultingblogs.emc.com/pauloreichert/archive/2005/05/21/1459.aspx從代碼生成工具獲取對程序集的引用

但是,代碼生成器必須查找使用生成器的程序集內的所有可用類型及其屬性。我想使用反射來做到這一點,但問題是我需要一個引用來查找類型的程序集。

如何獲取代碼生成器用於VS項目的組裝的引用?

+0

聽起來類似於這個http://csd.codeplex.com/其開源,也許它的代碼將幫助你 – Iain 2010-11-05 04:32:28

回答

0

我找到了解決方案。事實上,可以從代碼生成器中獲取對Visual Studio項目對象的引用。

我發現代碼及彼項目參考: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基本文件中讀取它來生成。不過,我很確定你可以得到沒有名字的參考。 (我只是懶惰,並停止調查,當我得到它的工作;-)

0

請注意,爲了生成程序集,Visual Studio需要編譯工具輸出的C#代碼。因此,在您的代碼生成器運行時,可能還沒有程序集(如果發生這種情況,乾淨的版本)。

+0

這使得總的意義上,但我認爲你已經領先一步......我不知道我是如何參考裝配的。 – jfs 2010-11-05 04:17:32

+0

我的觀點是(據我所知:-))你不能引用程序集,因爲VS沒有任何意義讓你引用一些可能不存在的東西。 :-) – 2010-11-05 04:20:50

+0

好的。但是在使用自定義工具進行代碼生成的項目中,是否還有其他方法來查找可用類型?也許我需要一個對Visual Studio項目對象或類似的東西的引用? – jfs 2010-11-05 04:27:22

相關問題