确定程序集是否是.NET框架的一部分

时间:2020-03-05 18:50:08  来源:igfitidea点击:

如何从程序集名称或者程序集类(或者其他类似的类)中判断程序集是否属于.NET框架(即System.windows.Forms)的一部分?

到目前为止,我已经考虑了PublicKeyToken和CodeBase属性,但是对于整个框架而言,它们并不总是相同的。

我想要此信息的原因是获取我的EXE文件正在使用的程序集的列表,该列表需要在客户端计算机上,因此我可以在不使用Visual Studio安装程序系统的情况下将正确的文件打包在安装程序文件中。问题是,我不想选择任何.NET框架程序集,而是希望它是一个自动过程,只要主要更新完成,该过程就很容易推出。

最终的解决方案是有一个IsFramework属性... :)

解决方案

回答

我怀疑最可靠和最通用的方法将是PublicKeyToken。是的,不止一个,但是它将是一个有限的列表,并且列表不会经常更改。

为此,我们可能只需要一个程序集名称的白名单-该清单在框架的各个版本之间也将是有限的和静态的。

回答

我们可以使用反射来查看程序集的发布者,并将其与程序集的路径进行协调。如果我们找到一个程序集,其发布者是Microsoft,并且位于C:\ Windows \ Microsoft.NET \ Framework下面,则可以肯定地认为它是运行时的一部分。

再三考虑,发布者甚至可能不是必需的。该路径下的所有内容都应该是运行时的一部分(除非行为不当的应用程序在不应该出现的地方进行修改)。

回答

不,它不是以"系统"开头。我们可以检查" WindowsBase"这是一个框架程序集。

我们还不能检查PublicKeyToken,因为还有其他使用"默认"键签名的Microsoft程序集,但它们不属于.NET Framework(Visual Studio程序集)的一部分。

最好的方法是获取已安装的.NET框架的集合,并检查目标程序集是否是其RedistList(RedistList \ FrameworkList.xml)的一部分。

可以在以下位置找到FrameworkList.xml:

  • .NET 2.0:C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ RedistList
  • .NET 3.x:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ vVersionNumber \ RedistList
  • .NET 4.x:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ vVersionNumber \ RedistList
  • .NET Core:C:\ Program Files(x86)\ Reference Assemblys \ Microsoft \ Framework.NETCore \ vVersionNumber \ RedistList

回答

如果我们知道所有DLL都不在GAC中,则可以检查每个程序集是否在GAC中。如果是这样,请勿复制。如果不是,请复制它。 Assembly类上有一个名为GlobalAssemblyCache的属性。在某些情况下,这显然比在其他情况下更好。

回答

为此,我使用了通过AssemblyProductAttribute嵌入到程序集中的产品名称。

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft? .NET Framework");

我正在使用该技术在应用程序的"关于"屏幕下按产品对装配件进行分组,这对我来说似乎很好。

回答

我不得不处理完全相同的问题。不幸的是,到目前为止给出的所有答案都不足以安全地确定程序集是否是.NET Framework的一部分。

微软将一个名为FXAssembly的类放入每个框架程序集的全局命名空间中,并带有一个指示版本的const字符串:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

使用此"标记"检查程序集是否为框架程序集。检查公钥也不会受到伤害。