【问题标题】:Any way to check if an assembly is a framework assembly, in .Net, other than checking the name for 'System'?除了检查“系统”的名称之外,还有什么方法可以检查程序集是否是.Net 中的框架程序集?
【发布时间】:2010-01-14 17:16:57
【问题描述】:

由于任何人都可以命名以“System”开头的程序集,因此检查“System”并不是一个令人满意的解决方案。

或者,如果这不可能,如何检查程序集中的模块?

【问题讨论】:

    标签: c# .net vb.net assemblies


    【解决方案1】:

    所有 .NET 程序集可能具有相同的公钥令牌:b77a5c561934e089

    【讨论】:

    • 我刚刚检查了反射器,虽然很多人都有那个钥匙,但其他人有钥匙.....e35。似乎只有 2 个不同的键,但是我只有有限数量的组件加载到反射器中。不过看起来很有希望。为 SO 上的更快答案干杯!
    • 这里有一篇更详细的帖子,包括验证签名以及验证令牌:blogs.msdn.com/shawnfa/archive/2004/06/07/150378.aspx
    • 解决方案的问题在于,自从 2004 年发布该帖子以来,现在还有 3 个键需要检查。最简单的检查方法是查看 GAC 文件夹:\assembly
    • 但是,如果没有其他答案,我会进行关键检查,因为如果我选择框架程序集,可能会发生更糟糕的事情,这会影响性能。
    • 性能?您可以尝试相反的方式:“白名单”所有想要的具有自定义属性的程序集并在例如之前检查它。循环程序集中的所有类型。
    【解决方案2】:

    这是一个移动的目标。例如,PrintForm 组件最初不是框架安装集的一部分,但它在 .NET 3.5 SP1 中。最好的办法是不要问这个问题,你总有一天会遇到麻烦。

    【讨论】:

      【解决方案3】:

      如果您不太关心安全性,那么您可以简单地检查路径

      Console.WriteLine(typeof(File).Assembly.Location.EndsWith(@"Microsoft.NET\Framework64\v2.0.50727\mscorlib.dll"));
      

      否则,如前所述,全名上的公钥令牌将是最安全的:

      Console.WriteLine(typeof(File).Assembly.FullName.Contains("PublicKeyToken=b77a5c561934e089"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        相关资源
        最近更新 更多