2014-03-13 47 views
3

我有用C#編寫的Visual Studio 2013軟件包,我需要在Visual Studio 2013運行時在C++項目文件中對項目及其屬性進行一些更改和項目已加載。實際上,保存整個解決方案時保存項目文件也可以。在Visual Studio 2013中更改項目元數據C#

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup Label="Test"> 
    <MyItemToChange Include = "TestItem"> 
     <MyMetadata1ToChange>Value1</MyMetadata1ToChange> 
     <MyMetadata2ToChange>Value2</MyMetadata2ToChange> 
    </MyItemToChange> 
    </ItemGroup> 
    <!-- The rest of the file --> 
</Project> 

在以前的Visual Studio版本中,我使用Microsoft.Build.Evaluation.Project類來更改項目的項目和元數據。當您有對項目的引用時,可以直接通過Project.Xml屬性訪問項目的XML結構,也可以保留不同的Microsoft.Build.Evaluation.ProjectItem並使用在那裏找到的接口。但是,由於Microsoft在其2013版本中更改了Visual Studio的結構,雖然Microsoft.Build.Evaluation.Project未被棄用,但由於集合爲空,因此無法通過Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.LoadedProjects再訪問C++項目。但是,如果你想訪問C#項目,它仍然有效。 (作爲事實上,深瀏覽到對象在調試時,你可以發現,他們仍然使用相同Microsoft.Build.Evaluation命名空間內表示。)

既然不能訪問任何Microsoft.Build.Evaluation.Project更多,我需要一個替代到

  1. 訪問項目,否則不是使用 Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.LoadedProjects
  2. 寫項目項和元數據,而Visual Studio的2013正在運行。

除非我已經錯過了一些東西,下面都不好,我的目的:只

  1. Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetItemAttribute套屬性中顯示在Solution Explorer中的項目。解決方案資源管理器中未顯示「MyItemToChange」
  2. 打開文件並手動編輯並保存。除非您知道如何禁止Visual Studio關於已更改項目的警告以及如何自動重新加載它,否則這不是一種方法。
    注意:您可以關閉解決方案,手動打開項目文件,編輯並保存並重新打開解決方案。它會正常工作,數據在那裏,除非文件在源代碼控制之下。現在,它開闢了很多新的問題(爲什麼EnvDTE.DTE.SourceControl.CheckOutItem()不起作用等)。所以我仍然認爲如果Visual Studio處理將數據寫入項目文件,我會更好。
  3. 反思。是的,正如我之前提到的那樣,我可以挖掘內部課程以獲得「原始」Microsoft.Build.Evaluation.ProjectMicrosoft.Build.Evaluation.ProjectItem的暫掛,但首先,它對於未來的使用是相當不安全的,據我所知,您無法確定如果你修改了這些現在的內部類,項目就會知道它很髒並且必須保存。

我很高興有任何建議,因爲我真的用盡了選項。

謝謝。

回答

2

嗯,我已經摸索出了解決方法,而不是問題的真正解決問題。

我現在做的是以下幾點:

  1. 詢問用戶是否是與封閉的整體解決方案,節省一切就OK了。如果沒有,我取消了整個過程:EnvDTE.DTE.ItemOperations.PromptToSave
  2. 嘗試問的Visual Studio 2013採用EnvDTE.DTE.SourceControl.CheckOutItem()方法檢查出該項目文件,我在源代碼控制。如果它拋出一個異常(NotImplementedException),我使用bodge檢出項目文件。也就是說,我使用Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetProperty()方法將自定義屬性寫入項目文件。
  3. 關閉整個解決方案。 EnvDTE.DTE.Solution.Close()
  4. 打開使用System.Xml.XmlDocument類項目文件。編輯。保存。哦,刪除我的寫在2點傻屬性(用於強制的Visual Studio 2013,檢查出源代碼控制的文件之一。)
  5. 重新打開解決方案。 EnvDTE.DTE.Solution.Open()此時可能會再次要求用戶確認一些源控制選項。

爲什麼它只是一種解決方法而不是一個合適的解決方案?

  • 這是醜陋。 :)
  • 方法是爲他們的目的不是要使用的東西(寫入隨機屬性到項目只是爲了力源控制結賬)
  • 如果關閉該解決方案/項目是這是行不通的濫用不是一種選擇。例如:如果您在編譯期間或編輯解決方案/項目/源文件時需要保存某些內容;或者如果你在項目的整個生命週期中不得不經常做一次。

我仍在尋找合適的解決方案。但直到有人能告訴我它是如何完成的,我必須接受這個當前的實現。

相關問題