隐藏模板可见性取决于VS版本?

时间:2015-07-23 09:57:46

标签: vsix vs-extensibility visual-studio-templates

我创建了一个带有2个模板的VSIX,一个用于VS2012,另一个用于VS2013。

但是如果我使用VSIX,那么两个模板在“New Project”窗口中对于两个VS版本都是可见的。我想限制它。有什么办法吗?

1 个答案:

答案 0 :(得分:0)

这不是一个很好的解决方案,但只有一个我找到了这个问题。

您可以使用以下属性注册程序包以在Visual Studio启动的早期初始化。

[ProvideAutoLoad(UIContextGuids80.NoSolution)]
public sealed YourPackage : Package

然后,在override void Initialize()方法中,您需要注册一个新的DTEEvent

DTEEvents dte_events;
private void RegisterStartupEvents()
{
    if(dte == null)
        dte = (DTE)GetService(typeof(DTE));


    if (dte != null)
    {
        dte_events = dte.Events.DTEEvents;
        dte_events.OnStartupComplete += OnStartupComplete;
    }
}

在初始化任何模板之前,OnStartupComplete将在启动时触发。要从当前VS版本的列表中删除它们,安装VSIX软件包时复制的捆绑zip模板文件必须已删除。这种方法可能更好,但你明白了。

private void OnStartupComplete()
{
    dte_events.OnStartupComplete -= OnStartupComplete;
    dte_events = null;
    var cleanupList = TemplateCleanupByVsVersion[MajorVisualStudioVersion];
    foreach (var deleteTemplate in cleanupList)
    {
        DirectoryInfo localVsDir = new DirectoryInfo(UserLocalDataPath);
        // Locate root path of your extension installation directory.
        var packageDllFileInfo = localVsDir.GetFiles("MyVsPackage.dll", SearchOption.AllDirectories)[0];
        DirectoryInfo extensionDirInfo = packageDllFileInfo.Directory;
        if (extensionDirInfo == null)
        {
            // Failed to locate extension install directory, bail.
            return;
        }
        var files = extensionDirInfo.GetFiles(deleteTemplate + ".zip", SearchOption.AllDirectories);
        if (files.Length > 0)
        {
            File.Delete(files[0].FullName);
        }
    }
    ServiceProvider.GetWritableSettingsStore().SetPackageReady(true);
}

TemplateCleanupByVsVersion是一个Dictionart<int,List<string>>,它将Visual Studio Major版本映射到您不希望在映射的Visual Studio版本中显示的zip文件名列表(不带扩展名)。例如,

public readonly Dictionary<int, List<string>> TemplateCleanupByVsVersion = new Dictionary<int, List<string>>
        {
            {11,new List<string> { "MyTemplate1.csharp", "MyTemplate2.csharp", "MyTemplate3.csharp" } },
            {12,new List<string> { "MyTemplate1.csharp" }},
            {14,new List<string>()}
        };

MajorVisualStudioVersion来自解析dte.Version。例如,

public int MajorVisualStudioVersion => int.Parse(dte.Version.Substring(0, 2));

结果是特定的Visual Studio版本可以从VSIX中删除任何效果不佳的模板。希望有所帮助。