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

问题描述 投票:1回答:1

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

我正在阅读通过C#的CLR书,遇到以下摘录:

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

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

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

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

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

c# .net assembly compilation friend
1个回答
2
投票

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

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

您会认为C#编译器可以自行确定,因为通常它自己确定输出文件名;但是,在输出文件名编译器没有决定,直到它是code完成编译因此需要/ out:编译器开关改进 显着的编译性能。

OP:

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

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

MSDN:

一个强名包括程序集的身份-它的简单文本名称,版本号和区域性信息(如果提供)-加上公钥和数字签名。 More...

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

OP:

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

强命名(我想我们仍然是在那一点上))发生了程序集之后程序集已生成。您不能签名不存在的签名。如果存在,则具有简单的文本名称。

而且,我们为什么现在要谈论程序集的.NET强命名(SN)?

© www.soinside.com 2019 - 2024. All rights reserved.