我正在尝试为 C++ 项目的自定义构建配置添加一个属性。我希望属性组合框显示可以在代码中设置的值的动态列表。我认为这应该使用 DynamicEnumProperty 类型来完成,但我不确定它的实现。在此之前有没有人使用过这个属性可以为我指明正确的方向?
谢谢
我正在尝试为 C++ 项目的自定义构建配置添加一个属性。我希望属性组合框显示可以在代码中设置的值的动态列表。我认为这应该使用 DynamicEnumProperty 类型来完成,但我不确定它的实现。在此之前有没有人使用过这个属性可以为我指明正确的方向?
谢谢
我知道这是一个有点老的问题......但你可能仍然喜欢这个解决方案;)
除了引用程序集并通过 MEF 导出所需的类型,如 Dmitry 上面解释的那样,您还需要将 VSPackage 标记为启用 MEF 以使其扫描您的合同。通过编辑 source.extension.vsixmanifest 来做到这一点:
对于 VS2010:
<Content>
<VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
对于 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 ,因此只需放置链接以供将来参考。
在您的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)或早期版本的类似程序集。