代码之家  ›  专栏  ›  技术社区  ›  Joshua Evensen

Visual studio生成后事件— 在项目中而不是在事件对话框中执行这些操作

  •  1
  • Joshua Evensen  · 技术社区  · 14 年前

    因此,我最近一直在做的事情是在我的代码解决方案中添加一个额外的项目,并在其中以编程的方式完成我的后期构建工作。此项目最后生成,然后自行启动。

    我能做的很酷的事情就是运行一个我创建的ILMerge自动化类来自动执行合并,如果我给它一个项目文件夹,在我的程序集信息中增加版本号,在任何我想要的地方复制文件等等。在我看来,这里的可能性是无穷的。

    我现在正在使用的一个示例--我有一个相当大的框架库,我将与我们的一个应用程序一起部署,但是我们不想单独包含所有DLL(大约有20个)。另外,我不需要库中的每个类都用于这个应用程序,所以精简它是有意义的。在图书馆的后期建设项目中,我正在做这个。。。

    outputDirectory = new DirectoryInfo(@"...postbuildmerges\output");
    solutionDirectory = new DirectoryInfo(@"...mainSolutionDirectory");
    
    #region Web Lib
    List<string> webLibraryNames = new List<string>
    {
        "Lib.Configuration",
        "Lib.Web",
        "Lib.Data",
        "Lib.Utilities",
        "Lib.Threading"
    };
    List<string> AllNeededAssemblies = new List<string>();
    webLibraryNames.ForEach((libname) => 
        {
            foreach (string assembly in GetLibraryAssemblies(libname))
                if (AllNeededAssemblies.Exists((assemblyName) => Path.GetFileName(assemblyName) == Path.GetFileName(assembly)) == false)
                    AllNeededAssemblies.Add(assembly);
        });
    
    SharpMergeAutomator.Merge(
        @"...path to primary assembly...",
        AllNeededAssemblies.ToArray(),
        "...desired output file...",
        //merges xml documentation
        true);
    #endregion
    

    那么这个后期构建项目是一个好的方法吗?是不是不必要的复杂?有更好的办法吗?人们通常会这样做吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Jimmy Hoffa    14 年前

    MSBuild是用于生成的脚本语言,它使您能够轻松地迭代文件夹树,并针对您喜欢的任何文件过滤器等提交操作。我认为您应该在MSBuild脚本中执行这些操作,因为当新的.net出现时,它很可能仍然是用于生成的脚本语言,你不必改变构建脚本来使用新的.net,然而你在这样的代码中做的构建工作越多,随着文件和东西的移动,你需要重写的代码就越多。另外,使用MSBuild,默认情况下您可以获得日志记录以及大量的内置内容。

    此外,还有许多社区任务可以轻松地用于ILMerge: http://code.google.com/p/ilmerge-tasks/wiki/HowToUse