有谁知道如何为C ++项目属性规则实现DynamicEnumProperty类型

时间:2013-08-06 21:01:38

标签: dynamic properties msbuild project enumeration

我正在尝试将属性添加到C ++项目的自定义构建配置中。我希望属性组合框显示我可以在代码中设置的动态值列表。我认为这应该使用DynamicEnumProperty类型完成,但我不确定它的实现。有没有人在使用这个属性之前可以指出我正确的方向?

谢谢

2 个答案:

答案 0 :(得分:0)

VSPackage(或其引用的任何MEF公开的DLL)中,创建一个实现IDynamicEnumValuesProvider的类,并将[Export(typeof(IDynamicEnumValuesProvider)), DynamicEnumCategory("MyCategory")]添加到该类的属性中。然后将EnumProvider="MyCategory"添加到DynamicEnumProperty定义中,您的类将用作值提供者。

确保您的软件包引用Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0.dllMicrosoft.VisualStudio.ProjectSystem.V12Only.dll(对于VS2013)或早期版本的类似程序集。

答案 1 :(得分:0)

我知道这有点老问题......但你仍然可以享受解决方案;)

除了引用程序集并通过MEF导出所需类型(如上面Dmitry所述),您还需要将VSPackage标记为启用MEF以使其通过合同进行扫描。通过编辑source.extension.vsixmanifest:

来做到这一点

for VS2010:

<Content>
  <VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
  <MefComponent>|%CurrentProject%|</MefComponent>
</Content>

for VS2012 / VS2013:

<Assets>
  <Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project"
         d:ProjectName="%CurrentProject%" Path="|%CurrentProject%|" />
</Assets>

这可以让你点击导出类中设置的断点。


此外,如果您需要在运行时“手动”创建对象,则可以使用VisualStudio的内部合成容器。从任何地方访问它的最简单方法是:

var container = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel)) as IComponentModel;
var service = container.GetService<SVsXYZ>();

我将很快在此处添加一个示例:https://github.com/phofman/vs-plugin,因此只需将链接放入以供将来参考。