簡體   English   中英

在Visual Studio 2013中更改項目元數據C#

[英]Changing Project Metadata in Visual Studio 2013 C#

我有一個用C#編寫的Visual Studio 2013包,我需要在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訪問C ++項目。 LoadedProjects作為集合是空的。 但是,如果要訪問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僅將屬性設置為“解決方案資源管理器”中顯示的項目。 解決方案資源管理器中不顯示“MyItemToChange”
  2. 打開文件並手動編輯並保存。 除非您知道如何抑制Visual Studio對已更改項目的警告以及如何自動重新加載它,否則它不是一種可行的方法。
    注意: 您可以關閉解決方案,手動打開項目文件,編輯然后保存並重新打開解決方案。 它會正常工作,數據就在那里,除非文件受源代碼控制。 現在它打開了很多新問題(為什么EnvDTE.DTE.SourceControl.CheckOutItem()不起作用等等。)所以我仍然認為如果Visual Studio將數據寫入項目文件,我會更好。
  3. 反射。 是的,正如我之前提到的,我可以挖掘內部類來獲取“原始” Microsoft.Build.Evaluation.ProjectMicrosoft.Build.Evaluation.ProjectItem ,但首先,它對未來非常不安全使用並且據我記得,你不能確定如果你現在修改這些內部類,項目將知道它是臟的並且必須保存。

我很高興有任何建議,因為我真的沒有選擇。

謝謝。

好吧,我已經找到了解決方法 ,而不是問題的真正解決方案。

我現在做的是以下內容:

  1. 詢問用戶是否可以關閉整個解決方案並保存所有內容。 如果沒有,我取消整個過程: 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()此時可能會再次要求用戶確認某些源控制選項。

為什么它只是一種解決方法而不是一個合適的解決方案

  • 很難看 :)
  • 方法被濫用於他們不打算使用的東西(將隨機屬性寫入項目以強制源控制結賬)
  • 如果關閉解決方案/項目不是一個選項,它將無法工作。 例如:如果您需要在構建期間或在編輯解決方案/項目/源文件時保存某些內容; 或者如果你不得不經常在項目的整個生命周期中做一次。

我仍在為這個問題尋找合適的解決方案。 但是,除非有人能告訴我它是如何完成的,否則我必須忍受當前的實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM