项目模板DTE Visual Studio 2017 nuget

时间:2017-06-28 13:42:44

标签: c# nuget envdte

我尝试用DTE自动创建一个项目这个工作完美但我不能添加一个nuget包...

选项1(下面的InstallNuGetPackage代码)

var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
//componentModel is always null

我已经安装了这个nuget包

  • NuGet.VisualStudio 4.0.0

并添加以下框架参考

  • Microsoft.VisualStudio.ComponentModelHost 15.0.0.0
  • Microsoft.VisualStudio.Shell.15.0 15.0.0.0

我找到了这个例子但是没有用 http://tylerhughes.info/archive/2015/05/06/installing-a-nuget-package-programmatically/

Option2(添加自己的package.config)

我也尝试创建packages.config xml但是我没有对这个包的引用,必须编辑csproj ......

public string GetPackagesConfig()
{
    var sb = new StringBuilder();
    sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    sb.AppendLine("<packages>");
    sb.AppendLine("<package id=\"log4net\" version=\"2.0.8\" targetFramework=\"net461\" />");
    sb.AppendLine("</packages>");

    return sb.ToString();
    //Add file to project
}

Visual Studio控件

var type = Type.GetTypeFromProgID("VisualStudio.DTE.15.0");
var obj = Activator.CreateInstance(type, true);
this._applicationObject = (DTE2)obj;

InstallNuGetPackage

public bool InstallNuGetPackage(EnvDTE.Project project, string package)
{
    bool installedPkg = true;
    try
    {
        var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));

        IVsPackageInstallerServices installerServices = componentModel.GetService<IVsPackageInstallerServices>();
        if (!installerServices.IsPackageInstalled(project, package))
        {
            var installer = componentModel.GetService<IVsPackageInstaller>();
            installer.InstallPackage(null, project, package, (System.Version)null, false);
        }
    }
    catch (Exception ex)
    {
        installedPkg = false;
    }
    return installedPkg;
}

创建项目

private void CreateProject(string projectSubFolder, string projectName)
{
    Solution2 solution2;
    string solutionFileFullName;
    string solutionFolderFullName;
    string projectFolderFullName;

    try
    {
        solution2 = (Solution2)_applicationObject.Solution;

        // Get the full name of the solution file
        solutionFileFullName = solution2.FileName;

        // Get the full name of the solution folder
        solutionFolderFullName = Path.GetDirectoryName(solutionFileFullName);

        // Compose the full name of the project folder
        projectFolderFullName = Path.Combine(solutionFolderFullName, projectSubFolder);
        if (!(projectFolderFullName.EndsWith("\\")))
        {
            projectFolderFullName += "\\";
        }

        var programfiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
        var template = @"Microsoft Visual Studio\2017\Community\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\ClassLibrary\csClassLibrary.vstemplate";
        var projectTemplateFileName = Path.Combine(programfiles, template);

        // Add the project
        solution2.AddFromTemplate(projectTemplateFileName, projectFolderFullName, projectName, false);

        //Save
        _applicationObject.Solution.SaveAs(_solutionFullFileName);

    }
    catch (Exception exception)
    {
        Log.Error(nameof(CreateProject), exception);
    }
}

1 个答案:

答案 0 :(得分:0)

通过此示例,您可以打开包管理器控制台窗口并发送install-package命令。

var packageManagerConsoleGuid = "{0AD07096-BBA9-4900-A651-0598D26F6D24}";
var window = this._visualStudioInstance.Windows.Item(packageManagerConsoleGuid);
window.Activate();

var commandName = "View.PackageManagerConsole";
var nugetCommand = "install-package log4net -ProjectName DemoProject";

this._visualStudioInstance.ExecuteCommand(commandName, nugetCommand);

我开发了一个项目,可以使用您可以在此处找到的项目自动创建解决方案 Nager.TemplateBuilder

此示例使用两个nuget包创建一个Windows桌面应用程序

//Configure Project
var demoProject = new ProjectInfo($"DemoProject", ProjectTemplate.WindowsClassicDesktopWindowsFormsApp);
demoProject.NugetPackages = new List<string> { "System.ServiceModel.NetTcp", "System.Runtime.Serialization.Xml" };

//Configure Solution
var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var solutionInfo = new SolutionInfo("Test", folder);
solutionInfo.ProjectInfos.Add(demoProject);

//Start building machine
var buildingMachine = new SolutionBuildingMachine();
buildingMachine.Build(solutionInfo);
buildingMachine.Dispose();