使用.NET命令行编译器编译项目(如ASP.NET、C#等)(6)

如果您未使用 /lib,则需要将这三个 .NET 代码库手动复制到包含输入文件的目录中。还请注意,如果在给定的命令集中多次发出 /lib 标志,则结果将累积起来。


理解 C# 2.0 引用别名

关于 /reference 选项需要进行的最后一点说明是,在 C# 2.0 中,现在可以为引用的程序集创建别名。通过该功能,可以解决在唯一命名的程序集中包含的名称完全相同的类型之间存在的名称冲突问题。

为了说明该功能的实用性,请在 C:\MyCSharpCode 目录中创建一个名为 MyCodeLibrary2 的新文件夹。将现有的 simpleType.cs 和 AsmInfo.cs 文件的副本放到新目录中。现在,向 SimpleType 中添加一个能够显示客户端提供的字符串的新方法:

/// <summary> /// Display a user supplied message. /// </summary> public static void PrintMessage(string msg) { Console.WriteLine("You said: {0}", msg); }

编译这些文件,以创建一个名为 MyCodeLibrary2.dll 的新程序集,如下所示:

csc /t:library /out:MyCodeLibrary2.dll *.cs

最后,将这一新代码库的副本放到 MyClient 文件夹(图 8)中。

使用.NET命令行编译器编译项目(如ASP.NET、C#等)

图 8. MyClient 文件夹中的新代码

现在,如果我们的当前客户端程序希望引用 MyCodeLibrary.dll 以及 MyCodeLibrary2.dll,则我们执行以下操作:

csc /t:exe /r:MyCodeLibrary.dll;MyCodeLibrary2.dll *.cs

编译器告诉我们,我们已经引入了名称冲突,因为这两个程序集都定义了一个名为 SimpleType 的类:

simpleTypeClient.cs(13,7): error CS0433: The type 'MyCodeLibrary.SimpleType' exists in both 'c:\MyCSharpCode\MyClient\MyCodeLibrary.dll' and 'c:\MyCSharpCode\MyClient\MyCodeLibrary2.dll'

乍看起来,您可能认为可以通过在客户端代码中使用完全限定名称来修复该问题。但是,这样做无法纠正该问题,因为这两个程序集定义了相同的完全限定名称 (MyCodeLibrary。SimpleType)。

使用 /reference 标志的新别名选项,我们可以为引用的每个代码库生成唯一的名称。在我们这样做之后,我们就可以更新客户端代码,以便将某个类型与特定的程序集相关联。

第一步是修改 simpleTypeClient.cs 文件,以使用我们将通过新的 extern alias 语法在命令行指定的别名:

// Extern alias statements must be // listed before all other code! extern alias ST1; extern alias ST2; using System; namespace MyClientApp { public class MyApp { public static void Main() { // Bind assembly to type using the '::' operator. ST1::MyCodeLibrary.SimpleType.DisplayEnvironment(); ST2::MyCodeLibrary.SimpleType.PrintMessage("Hello!"); Console.ReadLine(); } } }

请注意,我们已经使用 C# 2.0 extern alias 语句捕获了在命令行定义的别名。这里,ST1(简单类型 1)是为 MyCodeLibrary.dll 定义的别名,而 ST2 是 MyCodeLibrary2.dll 的别名:

csc /r:ST1=MyCodeLibrary.dll /r:ST2=MyCodeLibrary2.dll *.cs

给定这些别名,请注意 Main() 方法如何使用 C# 2.0 范围解析运算符 (::) 将程序集别名绑定到类型本身:

// This says "I want the MyCodeLibrary.SimpleType class // that is defined in MyCodeLibrary.dll". ST1::MyCodeLibrary.SimpleType.DisplayEnvironment();

进而,/reference 选项的这一变体可以提供一种避免名称冲突(当两个具有唯一名称的程序集包含名称完全相同的类型时发生)的方式。


使用 /addmodule 生成多文件程序集

就像您可能已经知道的那样,多文件程序集提供了一种将单个 .NET 二进制文件分解为多个较小的小文件的方式,这在远程下载 .NET 模块时证明很有帮助。多文件程序集的最终效果是让一组文件像一个单独引用和进行版本控制的单元那样工作。

多文件程序集包含一个主 *.dll,它包含程序集清单。该多文件程序集的其他模块(按照约定,它们采用 *.netmodule 文件扩展名)被记录在主模块的清单中,并且由 CLR 按需加载。迄今为止,生成多文件程序集的唯一方式是使用命令行编译器。

为了说明该过程,请在 C:\MyCSharpCode 目录中创建一个名为 MultiFileAsm 的新子目录。我们的目标是创建一个名为 AirVehicles 的多文件程序集。主模块 (Airvehicles.dll) 将包含单个名为 Helicopter 的类类型(稍后定义)。程序集清单编录了一个附加模块 (ufos.netmodule),该模块定义了一个名为 UFO 的类类型:

// ufo.cs using System; using System.Windows.Forms; namespace AirVehicles { public class UFO { public void AbductHuman() { MessageBox.Show("Resistance is futile"); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjfzjj.html