我在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,我不知道哪个答案是正确的。
答案 0 :(得分:2)
所有答案均不允许更改Assembly1,因此Assembly2必须具有与以前相同的标识。只有具有相同的名称,相同的版本和相同的公共密钥,才能实现相同的身份。
(希望)只有使用相同的私钥才能获得相同的公钥。哈希冲突也可能起作用,但这是偶然的,sn.exe
不能有意做到。
因此,正确答案是D:
运行al.exe命令对Assembly2进行签名。使用与原始Assembly2程序集相同的密钥文件。
也许考试书70-483与旧的.NET 2版本没有太大区别。我发现那本书的正确性很差。当时我提交了许多勘误表。
基本上,创建一个新的程序集并给它一个相同的名称,相同的版本和相同的键是一个坏主意,如in MSDN
所述具有相同强名称的程序集应该相同。
因此,它背后没有现实世界的用例-除了黑客攻击。我认为这本书希望您了解没有密钥就无法破解强大的命名程序集。
不幸的是,那不是真的,因为
a)MSDN says:
请勿依赖强名来保证安全性。它们仅提供唯一的身份。
为此使用代码签名(Authenticode)。
b)有一些工具可以删除强名称,通常,如果您删除所有DLL和EXE的强名称,它都可以正常工作。