我创建了一个带有2个模板的VSIX,一个用于VS2012,另一个用于VS2013。
但是如果我使用VSIX,那么两个模板在“New Project”窗口中对于两个VS版本都是可见的。我想限制它。有什么办法吗?
答案 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中删除任何效果不佳的模板。希望有所帮助。