添加一个具有相同名称的新装配

时间:2019-06-22 20:30:43

标签: c#

我在C#考试中发现了这个问题

您有两个分别用C#编写的名为Assembly1和Assembly2的程序集。 Assembly1通过执行以下代码来加载Assembly2。

Assembly myDLL = Assembly.Load(
         "Assembly2,Version=1.0.2.4,Culture=neutral,PublicKeyToken=..."
);

您在Microsoft Visual Studio中创建一个新项目,以生成将替换Assembly2的新程序集。

新程序集具有与原始Assembly2程序集相同的名称和版本。

执行代码时,Assembly1无法加载Assembly2。

您应该怎么做才能确保Assembly1可以加载Assembly2?

A。运行sn.exe命令来创建一个新的密钥文件。使用生成的密钥文件运行al.exe命令以对Assembly2进行签名。

B。使用sn.exe命令创建一个新的密钥文件。将assembly:AssemblyKeyFileAttribute属性设置为新的密钥文件。

C。修改项目属性。单击“对程序集签名”,然后选择一个新的密钥文件。

D。运行al.exe命令对Assembly2进行签名。使用与原始Assembly2程序集相同的密钥文件。

我相信正确的答案是A或B,我不知道哪个答案是正确的。

1 个答案:

答案 0 :(得分:2)

所有答案均不允许更改Assembly1,因此Assembly2必须具有与以前相同的标识。只有具有相同的名称,相同的版本和相同的公共密钥,才能实现相同的身份。

(希望)只有使用相同的私钥才能获得相同的公钥。哈希冲突也可能起作用,但这是偶然的,sn.exe不能有意做到。

因此,正确答案是D:

  

运行al.exe命令对Assembly2进行签名。使用与原始Assembly2程序集相同的密钥文件。

也许考试书70-483与旧的.NET 2版本没有太大区别。我发现那本书的正确性很差。当时我提交了许多勘误表。

基本上,创建一个新的程序集并给它一个相同的名称,相同的版本和相同的键是一个坏主意,如in MSDN

所述
  

具有相同强名称的程序集应该相同。

因此,它背后没有现实世界的用例-除了黑客攻击。我认为这本书希望您了解没有密钥就无法破解强大的命名程序集。

不幸的是,那不是真的,因为

a)MSDN says

  

请勿依赖强名来保证安全性。它们仅提供唯一的身份。

为此使用代码签名(Authenticode)。

b)有一些工具可以删除强名称,通常,如果您删除所有DLL和EXE的强名称,它都可以正常工作。