检查程序集的标识?可能它的名字很强?

时间:2011-07-27 10:53:40

标签: c# .net assemblies strongname

在我的某个应用中,我必须将自己添加的插件与其他插件区分开来 它们使用不同的密钥进行签名,主机应用程序也是如此。

有没有办法将我的装配与其他装配区分开来? (可能在签名密钥的帮助下)

4 个答案:

答案 0 :(得分:4)

您可以针对存储在容器程序集中的列表检查加载的程序集公钥标记。

http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

或者只是简单地存储程序集的全名,如下所示:

var assembly = typeof (string).Assembly;

var myAssemblies = new HashSet<string>
{
 "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
};

Assert.IsTrue(myAssemblies.Contains(assembly.FullName));

你也可以使用GetPublicKeyToken和BitConverter检查egenst标记

var assembly = typeof(string).Assembly;

var token = BitConverter.ToString(assembly.GetName().GetPublicKeyToken()).Replace("-","").ToLowerInvariant();

var expectedToken = "b77a5c561934e089";

Assert.AreEqual(expectedToken, token);

答案 1 :(得分:2)

如果所有程序集都已签名,您可以使用GetPublicKey()GetPublicKeyToken()

 Assembly a =...
 a.GetName().GetPublicKeyToken();

 Assembly a =...
 a.GetName().GetPublicKey();

并且比保留GUID列表更方便,也适用于将来的程序集。

答案 2 :(得分:2)

您可以通过检查强名称签名来完成此操作。有关如何操作,请参阅Checking For A Valid Strong Name Signature。请注意,该文章指的是使用带有StrongNameSignatureVerificationEx的P / invoke,但如果您使用的是.NET 4.0或更高版本,则应替换ICLRStrongName::StrongNameSignatureVerificationEx

请参阅Public Keys and Public Key Tokens了解公钥令牌的实际内容。鉴于它只是公钥的哈希值,因此容易复制或提取,然后注入不可信的程序集,它不是验证程序集的安全机制。

答案 3 :(得分:1)

一个不错的片段:

// Assembly is a System.Reflection.Assembly
public string GetAssemblyGUID(Assembly assembly)
{
    object[] objects = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false);
    if (objects.Length > 0)
        return ((System.Runtime.InteropServices.GuidAttribute)objects[0]).Value;
    else
        return null;
}

这将检索指定程序集的GUID。您可以在“项目属性”中设置程序集的GUID。这适用于类库和PE。