Assembly.LoadFrom - 使用Evidence重载来验证强名称签名

时间:2009-05-01 02:12:47

标签: c# .net assemblies

是否可以使用带有Evidence参数的Assembly.LoadFrom重载来确保程序集具有强名称?我希望能够指定程序集名称,区域性,版本和公钥标记。如果任何此类信息与程序集不匹配,则无法加载。

4 个答案:

答案 0 :(得分:3)

加载后可以获得程序集的公钥 - 如果它成功加载并具有公钥,那么它的名字很强:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

更好的是,在加载之前检查程序集的公钥和版本信息

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

如果GetPublicKey()返回非null值,然后成功加载程序集,则它具有有效的强名称。

答案 1 :(得分:1)

我有办法打破修补System.Windows.Forms.dll的强名称验证。如果我正在使用它,那么你无能为力。我的诀窍需要完全信任。

我所做的是修补dll,部署修补的dll,ngen它,然后修补加载器以获取修补后的ngen图像而不是原始图像。我能做的就是破坏股票ngened dll。 (我实际上测试了这条路径,并决定打破其他人的软件是一个糟糕的选择。)

我不是说这是个好主意。我说这取决于验证Assembly.Load的签名是一个坏主意。

答案 2 :(得分:0)

我找到了另一种方法。

var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>

Assembly.Load(assemblyName);

答案 3 :(得分:0)

尝试使用System.ReflectionAssemblyNameFlags枚举:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);