如何防止 IVsBuildPropertyStorage.SetItemAttribute 转义特殊字符?

6

我正在开发一个Visual Studio 2010扩展,想要给MSBuild项目添加一个属性,如下所示:

 <EmbeddedResource Include="SomeFile.xml">
      <FooAttribute>%(Filename)%(Extension)</FooAttribute>
 </EmbeddedResource>

目前我找到的唯一方法是使用 IVsBuildPropertyStorage.SetItemAttribute 方法。这对于简单字符串可以正常工作,但当我尝试使用MSBuild中特殊的字符时,会得到以下结果:

 <EmbeddedResource Include="SomeFile.xml">
      <FooAttribute>%29%25%28Filename%29%25%28Extension%29</FooAttribute>
 </EmbeddedResource>

这意味着SetItemAttribute会自动转义MsBuild字符,而我不希望这样。

你确定MSBuild不会接受这些字符的转义形式吗? - Jay Bazuzi
它接受这些字符的转义形式... 但我不想转义,我想在我的项目文件中使用 "%(Filename)%(Extension)"。如果我让 "%29%25%28Filename%29%25%28Extension%29",msbuild 将把它视为字符串常量。 - José F. Romaniello
1个回答

2
这个问题有点老了,但还是需要回答。VS2010似乎有更好的界面,可以在不转义的情况下设置值。
IVsBuildPropertyStorage2接口由项目系统实现,以使各种风味能够访问MSBuild属性系统。该接口提供了比IVsBuildPropertyStorage更灵活的属性设置方式。它允许添加一个新的条件属性组,并且不会转义值
具体来说,功能SetPropertyValueEx:http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsbuildpropertystorage2.setpropertyvalueex.aspx

1
文档不正确(不是你的错)。实际上,您正在寻找 IVsBuildPropertyStorage2 接口,该接口在 Visual Studio 2010 中添加了 SetPropertyValueEx 方法。 - Sam Harwell
啊,谢谢。我就知道有什么问题。不过,我注意到这里是SetPropertyValue,而不是SetItemAttribute。不确定这是否有帮助。 - Erti-Chris Eelmaa
说实话,这个已经太老了,我完全忘记我在做什么了,我已经不在 .Net 领域了。但是迟做总比不做好 :) - José F. Romaniello
@SamHarwell 你怎么获取 IVsBuildPropertyStorage2 实例? 我可以将 IHierarchy 强制转换为 IVsBuildPropertyStorage,但无法转换它到 IVsBuildPropertyStorage2 - reduckted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接