动态创建解决方案文件(.sln)和项目文件(.csproj)

时间:2014-02-25 06:05:35

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

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

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

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

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

代码

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

答案 2 :(得分:0)

你可以用它。这适用于.NET 2.0版本以上的.cs项目文件和framewwork。 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("\\")));
            }
        }
    }