2

我正在为我的组织创建一个多项目解决方案模板,该模板需要安装 Nuget 包并在创建时使用 Windows 窗体设置一些自定义参数。我正在使用 VSIX 部署它。

我有这两个功能分别运行,但我还没有找到同时使用这两个功能的方法。根据http://msdn.microsoft.com/en-us/library/vstudio/bb763141(v=vs.100).aspx Visual Studio 应该支持在项目模板中使用多个 IWizard,如果我正确理解它。

我尝试了直接方法,只是在 .vstemplate 文件中添加了对两个向导的引用,但只执行了第一个。我还尝试使用下面的代码在我的自定义向导中调用 Nuget-wizard,但我想我必须以某种方式使用 packages-info 设置 WizardData 才能使其工作...

var asm = Assembly.Load("NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
var nuget = (IWizard)asm.CreateInstance("NuGet.VisualStudio.TemplateWizard");
nuget.RunStarted(automationObject, replacementsDictionary, runKind, customParams);

可以实现多个 IWizard 实现的使用还是不可能?

4

1 回答 1

1

不,每个模板不能注册多个 IWizard 派生类,在 nuget 的情况下,您可以像这样通过反射调用它:

private void AddNugetPackage(VSProject VsProj, string PackageName, string Version)
    {
      try
      {
        Assembly nugetAssembly = Assembly.Load("nuget.core");
        Type packageRepositoryFactoryType = nugetAssembly.GetType("NuGet.PackageRepositoryFactory");
        PropertyInfo piDefault = packageRepositoryFactoryType.GetProperty("Default");
        MethodInfo miCreateRepository = packageRepositoryFactoryType.GetMethod("CreateRepository");
        object repo = miCreateRepository.Invoke(piDefault.GetValue(null, null), new object[] { "https://packages.nuget.org/api/v2" });
        Type packageManagerType = nugetAssembly.GetType("NuGet.PackageManager");
        ConstructorInfo ciPackageManger = packageManagerType.GetConstructor(new Type[] { System.Reflection.Assembly.Load("nuget.core").GetType("NuGet.IPackageRepository"), typeof(string) });
        DirectoryInfo di = new DirectoryInfo(ProjectPath);
        string solPath = di.Parent.FullName;
        string installPath = di.Parent.CreateSubdirectory("packages").FullName;
        object packageManager = ciPackageManger.Invoke(new object[] { repo, installPath });
        MethodInfo miInstallPackage = packageManagerType.GetMethod("InstallPackage",
          new Type[] { typeof(string), System.Reflection.Assembly.Load("nuget.core").GetType("NuGet.SemanticVersion") });
        string packageID = PackageName;
        MethodInfo miParse = nugetAssembly.GetType("NuGet.SemanticVersion").GetMethod("Parse");
        object semanticVersion = miParse.Invoke(null, new object[] { Version });
        miInstallPackage.Invoke(packageManager, new object[] { packageID, semanticVersion });
      }
      catch(Exception ex)
      { 
        // ...
        return;
      }      
    }
于 2014-07-03T20:50:11.193 回答