项目模板 DTE Visual Studio 2017 nuget

Project Template DTE Visual Studio 2017 nuget

我尝试创建一个使用 DTE 自动化的项目,这项工作非常完美,但我无法添加 nuget 包...

Option1(下面的InstallNuGetPackage代码)

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

我已经安装了这个 nuget 包

并添加以下框架引用

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

选项2(添加自己的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;

安装 NuGetPackage

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 Studio17\Community\Common7\IDE\ProjectTemplates\CSharp\Windows33\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);
    }
}

通过此示例,您可以打开程序包管理器控制台 window 并发送安装程序包命令。

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();