2010-07-01 50 views
1

我試圖以編程方式將一個導入任務添加到.csproj文件,但我不想使用Microsoft.Build.BuildEngine對象來執行此操作,因爲VS會彈出有關正在修改的項目文件的警告在Visual Studio之外。如何使用IVsBuildPropertyStorage添加MSBuild導入?

我見過幾頁[1] [2],提示IVsBuildPropertyStorage接口可以讓我訪問.csproj文件的MSBuild部分,但是我很難弄清楚如何做到這一點,或者如果它甚至可能是真的。它看起來像我需要指定我想要訪問的屬性的名稱,但我不知道如何弄清楚。對於「進口」屬性調用GetPropertyValue()不返回那些已經建立了我多麼希望我的最終結果看項目文件的任何東西:

EnvDTE.Project proj = ...; 
var sol = Package.GetGlobalService(typeof(VsSolution)) as IVsSolution; 
IVsHierarchy hier; 
sol.GetProjectOfUniqueName(p.UniqueName, out hier); 
var storage = hier as IVsBuildPropertyStorage; 
string val; 
storage.GetPropertyValue("Import", String.Empty, 
         (uint)_PersistStorageType.PST_PROJECT_FILE, out val); 
// val is null 

[1] https://mpfproj.svn.codeplex.com/svn/9.0/Tests/UnitTests/ProjectTest.cs
[2] http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/e1983591-120a-4a2f-a910-e596dd625e68

謝謝。我會很感激我可以得到的任何建議。

+0

也許有更簡單的方法。你爲什麼要修改你的.csproj?有條件的硬編碼「」能提供你所需要的嗎? – Filburt 2010-07-02 06:05:41

+0

我剛剛看到你以前的帖子解釋你在做什麼。 – Filburt 2010-07-02 06:12:51

+0

任何解決方案與完整的源代碼? – Kiquenet 2012-08-24 10:54:05

回答

1

Import元素不是在MSBuild中的Property元素也不是和Item之一。

我認爲你不能使用IVsBuildPropertyStorage添加Import

5

我問過類似的問題在這裏看到Programmatically adding and editing the Targets in a Visual Studio Project File你能做些什麼來導入添加到項目文件的程序是使用此命名空間http://msdn.microsoft.com/en-us/library/microsoft.build.construction.aspx這是從組件(在GAC)Microsoft.Build.dll。您可以在大約3-4步完成:

下面是僞代碼:

  1. 獲取使用DTE.ActiveSolutionProjects並獲得每個項目的屬性項目文件的位置。獲取FullPath和FileName以獲取項目文件的完整路徑。
  2. 一旦你的項目文件的完整路徑,調用ProjectRootElement.Open靜態方法:

    ProjectRootElement項目= ProjectRootElement.Open(projectPath);

  3. 一旦你的ProjectRootElement參考,你可以調用AddImport方法(其中name是項目標識屬性):

    project.AddImport(名稱)

應該這樣做。

+0

謝謝,當我回到這個問題時,我會探討這個選項。 – Greg 2011-01-04 21:19:27

+0

該解決方案的問題在於該文件是在進程外修改的,因此Visual Studio會要求重新加載該文件。 – 2011-04-15 15:49:29

相關問題