我正在使用以下代码尝试以编程方式从现有的控制台应用程序中动态创建Visual Studio 2015项目。你为什么问?我们正在整理一个包含所有代码片段的库,我们需要为每个代码片段提供测试/校对测试解决方案,因为我们有数百个,我们不打算手动完成。
最终这将是一个MVC5应用程序作为自己的项目(类库?)但是现在我们只是试图让它在这个控制台应用程序中运行。
我正在尝试使用2个项目(控制台应用程序和单元测试项目)创建一个新的解决方案。我甚至不确定我是否需要单元测试项目,或者是否一个人甚至可以使用控制台应用程序,因为有没有选项可以在VS2015解决方案生成中向控制台应用添加单元测试。
这是代码;
public class CreateConsoleProjectsProgrammatically
{
private const string Vs2015Type = "VisualStudio.DTE.14.0";
private const string Vs2015ConsoleProject = @"X:\Code Library\Helpers\ConsoleApplication\csConsoleApplication.vstemplate";
private const string Vs2015UnitTestProject = @"X:\Code Library\Helpers\UnitTestProject\UnitTestProject.vstemplate";
private const string Vs2015CodeLibraryBasepath = @"X:\Code Library";
public static void CreateVsConsoleProjectProgrammatically(string filename)
{
// Create a solution with two projects in it, based on project
// templates, a console project and a unit test project.
var vsType = Type.GetTypeFromProgID(Vs2015Type);
//error line is below
var vsInstance= Activator.CreateInstance(vsType, true);
EnvDTE.DTE dte = (EnvDTE.DTE)vsInstance;
dte.MainWindow.Visible = false; // optional: set to true if you want to see VS doing its thing
// create a new solution
dte.Solution.Create(@"X:\Code Library\", filename);
var solution = dte.Solution;
// create a C# console application
solution.AddFromTemplate(Vs2015ConsoleProject,Path.Combine(Vs2015CodeLibraryBasepath,filename), filename);
// create a unit test project
solution.AddFromTemplate(Vs2015UnitTestProject, Path.Combine(Vs2015CodeLibraryBasepath, filename + "_Test"), filename + "_Test");
// save and quit
dte.ExecuteCommand("File.SaveAll");
dte.Quit();
}
}
以下是来自Activator.CreateInstance
的错误由于以下错误,从IClassFactory创建具有CLSID {A2FA2136-EB44-4D10-A1D3-6FE1D63A7C05}的COM组件实例失败:8001010a消息过滤器指示应用程序正忙。 (来自HRESULT的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))。
不确定我为什么会收到服务器忙碌错误。这几乎看起来是因为VS已经开放了吗?但是,如何生成新的解决方案呢?我尝试关闭解决方案并重新打开它,但这没有解决问题。
我还认为它可能是连接问题,因此我将所有文件和目录移动到C:\但它产生了相同的错误,因此不存在使用网络驱动器位置的问题。
我也尝试过使用
EnvDTE80.DTE2 dte2 = (EnvDTE100.DTE2)vsInstance;
但根据编辑器,DTE2不是EnvDTE100上的可用属性/方法,尽管我在网上发现了一些使用它的例子。