首页 > 代码库 > VS2013使用VS2008的联合编译进行工程编译
VS2013使用VS2008的联合编译进行工程编译
公司开发C++是使用vs2008,编译的时候使用联合编译IncreBuild进行编译;在vs2008中使用visual assistx,如果代码太长,滚动的时候偶尔会出现页面乱码,而且有时候虚函数互相定位也有问题,没有vs2013使用方便,但是在vs2013中又不能直接编译,所有寻思做个插件解决编译问题;
因为工程文件都是使用vc9生成的,所有使用vs2013打开时,会自动进行工程升级,升级完成后,vc9和vs2013的工程会同时存在,如果想在vs2013中调用vs2008的编译器进行编译,可以通过联合编译调用vs2008的工程文件编译;
1、创建vs2013的插件工程;
2、在connect.cs中,修改函数OnConnection,在末尾增加代码,用来增加菜单
1 try 2 { 3 //Add a command to the Commands collection: 4 Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin1", "MyAddin1", "Executes the command for MyAddin1", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton); 5 6 //Add a control for the command to the tools menu: 7 if((command != null) && (toolsPopup != null)) 8 { 9 command.AddControl(toolsPopup.CommandBar, 1);10 }11 CommandBar slnCommandBar = GetCommandBarByName("Project");12 // Add a new command13 AddNamedCommand2(slnCommandBar, "Build",14 "Build By IncreBuild", "Build By IncreBuild", false, 0, 1);15 }16 catch(System.ArgumentException)17 {18 //If we are here, then the exception is probably because a command with that name19 // already exists. If so there is no need to recreate the command and we can 20 // safely ignore the exception.21 }
3、修改函数QueryStatus,用来显示菜单
1 public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText) 2 { 3 if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone) 4 { 5 if(commandName == "MyAddin1.Connect.MyAddin1") 6 { 7 status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled; 8 return; 9 }10 if (commandName == "MyAddin1.Connect.Build")11 {12 status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled;13 return;14 }15 }16 }
4、执行的时候,根据获得到的工程文件,解析路径,然后编写一个使用联合编译的脚本就行了
1 public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 2 { 3 handled = false; 4 if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 5 { 6 if(commandName == "MyAddin1.Connect.MyAddin1") 7 { 8 handled = true; 9 return;10 }11 else if (commandName == "MyAddin1.Connect.Build")12 {13 try14 {15 SelectedItems items = _applicationObject.SelectedItems;16 System.Array projs = items.DTE.ActiveSolutionProjects as System.Array;17 string projectname = null;18 foreach (Project item in projs)19 {20 projectname = item.UniqueName;21 }22 if (null != projectname)23 {24 BuildProject(projectname);25 }26 }27 catch(Exception e)28 {29 30 }31 handled = true;32 return;33 }34 }35 }36 37 private void BuildProject(string Proj)38 {39 if(!File.Exists(Proj))40 {41 return;42 }43 if(!Proj.Contains("vcxproj"))44 {45 return;46 }47 string oldprj = Proj.Replace("vcxproj", "vcproj");48 if(!File.Exists(oldprj))49 {50 return;51 }52 XmlDocument xdoc = new XmlDocument();53 xdoc.Load(oldprj);54 XmlElement root=xdoc.SelectSingleNode("VisualStudioProject") as XmlElement;55 if(root.GetAttribute("ProjectType") != "Visual C++" || 56 root.GetAttribute("Version") != "9.00")57 {58 return;59 }60 string projname=root.GetAttribute("Name");61 List<string> lstconfig = new List<string>();62 XmlNodeList lstconfignode = xdoc.SelectNodes("//VisualStudioProject/Configurations/Configuration");63 foreach(XmlElement item in lstconfignode)64 {65 lstconfig.Add(item.GetAttribute("Name"));66 }67 if(lstconfig.Count<=0)68 {69 return;70 }71 72 DirectoryInfo dir = Directory.GetParent(oldprj);73 string batfile = dir.ToString() +"\\"+ projname + ".bat";74 StreamWriter sw = new StreamWriter(batfile);75 sw.Write("buildconsole ");76 sw.Write(oldprj);77 sw.Write(" /prj=\"");78 sw.Write(projname);79 sw.Write("\" /build /OpenMonitor /cfg=\"");80 sw.Write(lstconfig[0]);81 sw.Write("\"\r\n");82 sw.Flush();83 sw.Close();84 85 86 87 System.Threading.Thread t = new System.Threading.Thread(new ThreadStart(() => {88 ProcessStartInfo info = new ProcessStartInfo(batfile);89 info.CreateNoWindow = true;90 info.RedirectStandardOutput = false;91 info.RedirectStandardInput = false;92 info.UseShellExecute = true;93 System.Diagnostics.Process p = System.Diagnostics.Process.Start(info);94 p.WaitForExit();95 }));96 t.Start();97 98 99 }
VS2013使用VS2008的联合编译进行工程编译
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。