zoukankan      html  css  js  c++  java
  • 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 command
    13                     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 name
    19                     //  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                     try
    14                     {
    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(""
    ");
    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         }
  • 相关阅读:
    How To Verify TLS Options in Windows
    How to auto-generate a C# class file from a JSON string [closed]
    javascript-questions
    What is the difference between application server and web server?
    Manjaro Rust环境搭建
    Trojan
    50 年的软件开发经验带给我的 63 个启示
    对《GGX》shader的分析-卡通渲染-罪恶装备
    科学迷信
    Tokio,Rust异步编程实践之路
  • 原文地址:https://www.cnblogs.com/mandaren/p/3934441.html
Copyright © 2011-2022 走看看