【发布时间】:2009-05-01 02:12:46
【问题描述】:
是否可以使用带有 Evidence 参数的 Assembly.LoadFrom 重载来确保程序集被强命名?我希望能够指定程序集名称、文化、版本和公钥标记。如果任何这些信息不匹配,则程序集将无法加载。
【问题讨论】:
标签: c# .net assemblies
是否可以使用带有 Evidence 参数的 Assembly.LoadFrom 重载来确保程序集被强命名?我希望能够指定程序集名称、文化、版本和公钥标记。如果任何这些信息不匹配,则程序集将无法加载。
【问题讨论】:
标签: c# .net assemblies
您可以在加载后获取程序集的公钥 - 如果加载成功并且有公钥,则它是强命名的:
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() 返回非空值,然后程序集成功加载,则它具有有效的强名称。
【讨论】:
我有办法打破修补 System.Windows.Forms.dll 的强名称验证。如果我正在使用它,那么您无能为力。我的伎俩需要完全信任。
我所做的是修补 dll,部署修补的 dll,ngen 它,然后修补加载程序以获取修补的 ngen 图像而不是原始图像。我本可以做的是破坏股票 ngened dll。 (我实际上测试了这条路径,并认为可能破坏其他人的软件是一个糟糕的选择。)
我并不是说这样做是个好主意。我是说依赖于 Assembly.Load 验证签名是个坏主意。
【讨论】:
我找到了另一种方法。
var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>
Assembly.Load(assemblyName);
【讨论】:
试试System.ReflectionAssemblyNameFlags 枚举:
bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
【讨论】: