我正在尝试将属性添加到C ++项目的自定义构建配置中。我希望属性组合框显示我可以在代码中设置的动态值列表。我认为这应该使用DynamicEnumProperty类型完成,但我不确定它的实现。有没有人在使用这个属性之前可以指出我正确的方向?
谢谢
答案 0 :(得分:0)
在VSPackage
(或其引用的任何MEF公开的DLL)中,创建一个实现IDynamicEnumValuesProvider
的类,并将[Export(typeof(IDynamicEnumValuesProvider)), DynamicEnumCategory("MyCategory")]
添加到该类的属性中。然后将EnumProvider="MyCategory"
添加到DynamicEnumProperty
定义中,您的类将用作值提供者。
确保您的软件包引用Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0.dll
和Microsoft.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,因此只需将链接放入以供将来参考。