任何曾经寻找将多个程序合并到一个文件中的解决方案的人都可能听说过ILMerge、SmartAssembly等工具。
另一个众所周知的方案是将DLL作为资源嵌入(如果你感兴趣,这里有一篇精彩的文章描述了这个方案,从嵌入式资源加载DLL[^)。
在某些情况下,我意识到使用这些方法是必要的。如果我们有编译过的源代码,我们可以通过在编译期间将所有这些源代码文件导入到一个项目中来获得这些东西的完美组合。
这里我会试着简单描述一下怎么做。
为了演示,让我们假设我们有一个控制台应用程序(这是我们的主程序),引用并使用两个类库(我们的辅助程序),我们希望将它们组合成一个文件:
我们根据这个假设构建了这个解决方案,得到了这三个程序:
请注意,MyExecutable的项目文件(MyExecutable.csproj)是一个基于XML的文件,如果我们查看它的内容,我们会发现一些ItemGroup节点。这些节点包含定义构建过程输入的子元素。这些子元素可以引用需要编译的应用程序的资源文件,也可以引用一些需要复制的资源。以及需要包含在构建过程中的程序集(如果您对此感兴趣,可以在MSDN MSBuild上了解有关Visual Studio项目文件的更多信息)。
现在让我们导航到项目组节点,它指的是要包含的程序集:
项目组项目引用包含='. my library 1 my library 1 . cs proj ' Project { ea 53 ca 82-13d 7-4 be 1-b95a-4d 9d 7853d 46e }/Project Name my library 1/Name/Project reference Project reference Include='. my library 2 my library 2 . cs proj ' project { c31d 21 F3-e86a-4581-b4e 8-acae 6644d 19e }/项目名称my library 2/name/project reference/item group在此,我们将添加一个条件,表明在Debug模式下构建MyExecutable时,应该使用来自MSBuild的这些项目引用:
ItemGroupPartition='' $(配置)'==' debug ' '。对于发布模式,我们包含并编译来自MyLibrary1和MyLibrary2的所有源代码文件。我们将使用通配符(' * * *。CS’)包括目录及其子目录中的所有CS文件。通配符还包括一些不需要的资源代码文件(temporarygeneratedfile _ [guid]就是这种情况)。cs在obj文件夹中,AssemblyInfo.cs文件在Property文件夹中),所以我们将3360排除它们。
项目组条件=' '$(配置)'='发布' '编译包括='.MyLibrary1***。cs' Exclude='. my library 1 Properties assembly info . cs; MyLibrary1 obj * *. my library 1 bin * * ' linkmy library 1 %(RecursiveDir)%(文件名)%(扩展名)/Link Visiblefalse/Visible/Compile Compile Include='.MyLibrary2** *。cs' Exclude='. my library 2 Properties assembly info . cs; MyLibrary2 obj * *. mylibrary 2 bin * * '链接mylibrary 2 %(递归目录)%(文件名)%(扩展名)/link visible false/visible/compile/item group,如此而已。让我们将修改保存在MyExecutable.csproj中,并在发布模式下重新构建解决方案。
我想强调的最后一点是,因为我们正式将所有汇编源文件的编译转移到一个项目中,所以该项目需要能够编译这些文件。因此,你需要考虑以下事情:
为了成功构建,主程序需要辅助程序的所有引用、资源、设置等。
所有程序集都需要用相同的。NET语言。
以上就是本文所描述的全部内容,希望大家能够喜欢。