【问题标题】:Create solution file(.sln) and project files(.csproj) dynamically动态创建解决方案文件(.sln)和项目文件(.csproj)
【发布时间】:2014-02-25 06:05:34
【问题描述】:

我正在使用 .NET Framework 4.0 在 Visual Studio 2012 中创建代码生成工具(基于表结构的自动代码生成)作为 Windows 窗体应用程序。它正在生成可移植对象、控制器、WCF 服务和业务逻辑代码文件。

所有代码文件捆绑在适当的项目中,所有项目捆绑在一个解决方案中。解决方案和项目需要通过程序动态创建。

我尝试使用 Visual Studio 插件项目创建解决方案和项目。它在加载项项目(单独的解决方案)中运行良好。 OnConnection 方法在Add-in 项目中自动调用。现在我想在我的代码生成工具中实现它。在Add-In 中调试时,application 变量显示为COM object

我试图从代码生成工具传递OnConnection 方法的值,它会引发错误(我为application 变量传递了this 对象)。我真的不知道如何从我的代码生成工具中调用这个方法。有人帮忙吗?

代码

 private DTE2 _applicationObject;
 private AddIn _addInInstance;

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    createProjectsFromTemplates(_applicationObject);
}


public void createProjectsFromTemplates(DTE2 dte)
{
    try
    {
        Solution2 soln = (Solution2)dte.Solution;
        string csTemplatePath;
        string csPrjPath = "SamplePath\\TestCreateProject";
        csTemplatePath = soln.GetProjectTemplate("WpfApplication.zip", "CSharp");
        System.Windows.Forms.MessageBox.Show("C# template path: " + csTemplatePath);

        soln.AddFromTemplate(csTemplatePath, csPrjPath, "NewWCFCSharpAutoGeneratorProject", false);

        Project prj;
        ProjectItem prjItem;

        String itemPath;
        // Point to the first project (the Visual Basic project).
        prj = soln.Projects.Item(1);

        prjItem = prj.ProjectItems.AddFromFileCopy("SampelCSharp.cs");
    }
    catch (System.Exception ex)
    {
        System.Windows.Forms.MessageBox.Show("ERROR: " + ex.Message);
    }
}

【问题讨论】:

标签: c# winforms visual-studio-2010 visual-studio-2013 visual-studio-addins


【解决方案1】:

您可以从宿主应用程序实例化一个 VS 并生成文件。希望这会奏效。下面的代码很适合我。

使用以下命名空间来执行以下给定代码。

命名空间:

using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Resources;
using System.Reflection;

代码:

EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");

Connect objConnect = new Connect();
Array objArray = null;
objConnect.OnConnection(dte2, ext_ConnectMode.ext_cm_UISetup, null, ref objArray);

【讨论】:

    【解决方案2】:

    【讨论】:

    【解决方案3】:

    你可以使用它。这适用于 .NET 2.0 版本以上的 .cs 项目文件和框架。 VB 项目源不兼容。

    protected void Build(string project)
        {
    
    
            Engine engine = new Engine();
    
            BuildPropertyGroup properties = new BuildPropertyGroup();
    
            properties.SetProperty(@"Configuration", @"Debug");
    
    
            // Point to the path that contains the .NET Framework 2.0 CLR and tools
            engine.BinPath = @"c:\windows\microsoft.net\framework\v3.5";
    
            // Instantiate a new FileLogger to generate build log
            FileLogger logger = new FileLogger();
    
            // Set the logfile parameter to indicate the log destination
            string str   = @"logfile=D:\temp";
                   str  += project.Substring(project.LastIndexOf("\\"), project.LastIndexOf(".") - project.LastIndexOf("\\")) + ".log";
            logger.Parameters = str;
    
            // Register the logger with the engine
            engine.RegisterLogger(logger);
    
    
            // Build a project file
            bool success = engine.BuildProjectFile(project, new string[] { "build" }, properties);
    
            //Unregister all loggers to close the log file
            engine.UnregisterAllLoggers();
    
            using (BinaryWriter writer = new BinaryWriter(File.Open(@"D:\temp\Prj.log", FileMode.Append)))
            {
                if (success)
                {
                    writer.Write("\nBuild Success :" + project.Substring(project.LastIndexOf("\\")));
                }
                else
                {
                    writer.Write("\nBuild Fail :" + project.Substring(project.LastIndexOf("\\")));
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多