为什么在编译朋友程序集时编译器需要程序集文件名?

时间:2019-11-28 21:27:29

标签: c# .net compilation .net-assembly friend

为什么在编译朋友程序集时编译器需要程序集文件名?

我正在阅读通过C#编写的 CLR,并且遇到了以下摘录:

  

请注意,C#编译器要求您使用   / out:编译好友程序集(不包含该程序集的程序集时,编译器切换)   包含InternalsVisibleTo属性)。该开关是必需的,因为编译器需要   知道正在编译的程序集的名称,以确定是否应生成结果程序集   被视为朋友集会。您可能会认为C#编译器可以自行确定   因为通常它自己确定输出文件名;但是,编译器没有决定   输出文件名,直到完成代码编译为止。因此需要/ out:编译器   开关可以显着提高编译性能。

     

此外,如果您要使用C#的/ t:module开关编译模块(而不是程序集),并且   该模块将成为好友程序集的一部分,您需要使用以下命令编译该模块   C#编译器的/ moduleassemblyname:开关也是如此。这告诉编译器什么   组装模块将成为模块的一部分,因此编译器可以允许模块中的代码访问其他模块   程序集的内部类型。

上面的摘录意味着放置程序集的文件与程序集具有相同的名称。但是事实并非如此,因为一个重命名的程序集名称由程序集的名称,区域性,公钥和版本号组成。

否则,我得出的结论是不可能为程序集名称提供定义,因为名称的定义假定我们已经知道名称是什么。因为名称 = 名称 +文化+公钥+版本号。

那么,有人可以以一种万无一失的方式来解释为什么文件名对朋友程序集编译很重要吗?文件和程序集名称之间有什么关系?

1 个答案:

答案 0 :(得分:2)

  

为什么在编译朋友程序集时编译器需要程序集文件名?

在您提供的报价单中注明:

  

您可能会认为C#编译器可以自行确定,因为它通常自行确定输出文件名。但是,编译器直到完成编译 代码之前,不会决定输出文件名因此,需要/ out:编译器开关改善 编译性能。

OP:

  

上面的摘录意味着放置程序集的文件与程序集具有相同的名称。但是事实并非如此,因为一个重命名的程序集名称由程序集的名称,区域性,公钥和版本号组成。

完全没有说,这不是不是强命名(SN)程序集的定义。

MSDN:

  

强名由程序集的身份(简单文本名称,版本号和区域性信息(如果提供))以及公用密钥和数字签名组成。 More...

确保简单文本名称可能是在签名时的程序集/文件名中派生的,但这是偶然的。

OP:

  

否则,我得出的结论是不可能为程序集名称提供定义,因为名称的定义假定我们已经知道名称是什么。因为名称=名称+文化+公钥+版本号。

强命名(我想我们仍然在那一点上),在生成组装后 会进行组装。您不能签名不存在的签名。如果存在,则具有简单的文本名称。

此外,我们为什么现在要讨论程序集的.NET强命名(SN)?