MSBuild Engine分析C#/VB.Net工程文件

前提:有的人可能人为分析工程的XML文件,但VB与C#工程的XML有一些不同,我曾经采用这样的方式来获取工程信息的数据
但是一旦用户通过VS设置工程的一些属性,则分析XML带来的是很多条件上的判断,所以后来改用如下方式分析工程文件

 

//Engine实例,必须传入DotNet2.0所在目录
//Microsoft.Build.BuildEngine命名空间下的Engine

  1. Engine eng = new Engine(GetDotNetRoot());
  2. private static string GetDotNetRoot()
  3. {
  4.     Assembly assembly = typeof(int).Assembly;
  5.     return Path.GetDirectoryName(assembly);
  6. }

//Microsoft.Build.BuildEngine命名空间下的Project

  1. Project prj = new Project(eng);
  2. prj.Load(/*this.ProjectFileName*/此参数为工程文件名);    //此参数值来源于下面的TASK中的代码
  3. this._AssemblyName = prj.EvaluatedProperties["AssemblyName"].Value; //程序集名称
  4. this._Namespace = prj.EvaluatedProperties["RootNamespace"].Value;   //根命名空间
  5. if (prj.EvaluatedProperties["OutputType"].Value.ToLower().CompareTo("library") == 0)
  6.     this._OutExtName = ".dll";  //类库输出类型
  7. else
  8.     this._OutExtName = ".exe";  //exe输出类型
  9. this._OutPath = prj.EvaluatedProperties["OutputPath"].Value;    //编译后输出的目录

//以下代码段得到,编译输出的文件名含有绝对路径

  1. char DiskVolumeChar = Path.VolumeSeparatorChar;
  2. if (this._OutPath.IndexOf(DiskVolumeChar) > -1)
  3.     this._OutBinaryName = Path.Combine(this._OutPath, this._AssemblyName + this._OutExtName);
  4. else
  5. {
  6.     FileInfo finfo = new FileInfo(this.ProjectFileName);
  7.     this._OutBinaryName = Path.Combine(finfo.DirectoryName, this._OutPath);
  8.     DirectoryInfo dinfo = new DirectoryInfo(this._OutBinaryName);
  9.     this._OutBinaryName = Path.Combine(dinfo.FullName, this._AssemblyName + this._OutExtName);
  10. }
  11. FileInfo fchk = new FileInfo(this._OutBinaryName);
  12. if (!fchk.Exists) this._OutBinaryName = string.Empty;

//分析工程文件主要用于自定义编译的任务,也可能,分析工程文件中的信息,也有助于编写VS的ADDIN插件,其中本人在编写插件时使用过,需要工程中的信息数据
//比如,为完成编译后AOP静态注入,(不是在程序运行时执行代码注入)

  1. public class AopBuildTask : Microsoft.Build.Utilities.Task
  2. {
  3.     public override bool Execute()
  4.     {
  5.         
  6.         string prjFileName = this.BuildEngine.ProjectFileOfTaskNode;
  7.         /*
  8.         上面的代码中所使用的此变量
  9.         prj.Load(prjFileName);
  10.         */
  11.         AopTaskHelper.Log = this.Log;
  12.         AopTaskHelper.Waveing(prjFileName);
  13.         return true;
  14.     }
  15. }

如果转载请注明出处

本人邮件[email protected]

 

 

你可能感兴趣的:(MSBuild Engine分析C#/VB.Net工程文件)