在Visual Studio 2013 c#中更改项目元数据

本文关键字:项目 元数据 Visual Studio 2013 | 更新日期: 2023-09-27 17:49:54

我有一个用c#编写的Visual Studio 2013包,我需要在c++项目文件中对项目及其属性进行一些更改,而Visual Studio 2013正在运行并加载项目。实际上,在保存整个解决方案的时候保存项目文件也是可以的。

<?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 . evaluate . project类来更改项目的项和元数据。当您有对项目的引用时,您可以直接通过Project.Xml属性访问项目的XML结构,也可以获取不同的Microsoft.Build.Evaluation.ProjectItem并使用在那里找到的接口。

然而,由于微软在2013年发布的版本中改变了Visual Studio的结构,虽然Microsoft.Build.Evaluation.Project没有被弃用,但你不能再通过Microsoft. build . evaluate . projectcollection . globalprojectcollection . loaddprojects访问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仅为解决方案资源管理器中显示的项目设置属性。"MyItemToChange"在解决方案资源管理器
  2. 中没有显示
  3. 打开文件,手动编辑并保存。除非你知道如何抑制Visual Studio关于更改项目的警告以及如何自动重新加载它,否则这不是一种可行的方法。
    注意:您可以关闭解决方案,手动打开项目文件,编辑然后保存并重新打开解决方案。它会工作得很好,数据在那里,除非文件处于源代码控制之下。现在它打开了一大堆新的问题(为什么envdte . dte . sourceccontrol . checkoutitem()不起作用,等等)所以我仍然认为如果Visual Studio将处理写入数据到项目文件我会更好。
  4. 反射。是的,正如我之前提到的,我可以深入研究内部类来获得对"原始"Microsoft.Build.Evaluation.ProjectMicrosoft.Build.Evaluation.ProjectItem的控制,但首先,它对未来的使用是相当不安全的,就我所知,你不能确定如果你修改这些现在的内部类,项目会知道它是脏的,必须保存。

我真没办法了,能有什么建议我很高兴。

谢谢。

在Visual Studio 2013 c#中更改项目元数据

嗯,我已经想出了一个的变通方法,但不是真正解决问题的方法。

我现在做的是:

  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检出源代码管理中的文件)重新打开解决方案。EnvDTE.DTE.Solution.Open()此时可能会再次要求用户确认一些源代码控制选项。

为什么它只是一个变通而不是一个适当的解决方案?

    丑陋
  • 。:)
  • 方法被滥用用于他们不打算使用的事情(将随机属性写入项目中只是为了强制源代码控制检出)
  • 如果关闭解决方案/项目不是一个选项,它将不起作用。例如:如果您需要在构建期间或在编辑解决方案/项目/源文件时保存某些内容;或者如果你必须经常这样做,而不是在项目的生命周期中只做一次。

我还在寻找合适的解决方案。但是在有人告诉我怎么做之前,我只能接受当前的实现