在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
,我需要一个替代
- 访问项目,而不是使用
Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.LoadedProjects
- 在Visual Studio 2013运行时编写项目项和元数据
除非我错过了什么,否则以下内容对我的目的来说是不好的:
-
Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetItemAttribute
仅为解决方案资源管理器中显示的项目设置属性。"MyItemToChange"在解决方案资源管理器 中没有显示 - 打开文件,手动编辑并保存。除非你知道如何抑制Visual Studio关于更改项目的警告以及如何自动重新加载它,否则这不是一种可行的方法。
注意:您可以关闭解决方案,手动打开项目文件,编辑然后保存并重新打开解决方案。它会工作得很好,数据在那里,除非文件处于源代码控制之下。现在它打开了一大堆新的问题(为什么envdte . dte . sourceccontrol . checkoutitem()不起作用,等等)所以我仍然认为如果Visual Studio将处理写入数据到项目文件我会更好。 - 反射。是的,正如我之前提到的,我可以深入研究内部类来获得对"原始"
Microsoft.Build.Evaluation.Project
和Microsoft.Build.Evaluation.ProjectItem
的控制,但首先,它对未来的使用是相当不安全的,就我所知,你不能确定如果你修改这些现在的内部类,项目会知道它是脏的,必须保存。
我真没办法了,能有什么建议我很高兴。
谢谢。
嗯,我已经想出了一个的变通方法,但不是真正解决问题的方法。
我现在做的是:
- 询问用户是否可以关闭整个解决方案并保存所有内容。如果没有,我取消整个过程:
EnvDTE.DTE.ItemOperations.PromptToSave
- 尝试要求Visual Studio 2013在使用
EnvDTE.DTE.SourceControl.CheckOutItem()
方法的源代码控制中为我检查项目文件。如果它抛出一个异常(NotImplementedException),我使用一个bodge来检出项目文件。也就是说,我使用Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetProperty()
方法将自定义属性写入项目文件。 - 关闭整个方案。
EnvDTE.DTE.Solution.Close()
使用
System.Xml.XmlDocument
类打开项目文件。编辑。保存。哦,把我写在2里的愚蠢属性去掉。点(用于强制Visual Studio 2013检出源代码管理中的文件)重新打开解决方案。EnvDTE.DTE.Solution.Open()
此时可能会再次要求用户确认一些源代码控制选项。为什么它只是一个变通而不是一个适当的解决方案?
- 丑陋
- 的。:)
- 方法被滥用用于他们不打算使用的事情(将随机属性写入项目中只是为了强制源代码控制检出)
- 如果关闭解决方案/项目不是一个选项,它将不起作用。例如:如果您需要在构建期间或在编辑解决方案/项目/源文件时保存某些内容;或者如果你必须经常这样做,而不是在项目的生命周期中只做一次。
我还在寻找合适的解决方案。但是在有人告诉我怎么做之前,我只能接受当前的实现