我正在使用.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);
}
}
答案 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("\\")));
}
}
}