19

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

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

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

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

4

7 回答 7

11

不,它不是以“系统”开头的。您可以检查“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\v VersionNumber \RedistList
  • .NET 4.x:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v VersionNumber \RedistList
  • .NET Core:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v VersionNumber \RedistList
于 2009-04-14T22:02:58.467 回答
5

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

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

我正在使用这种技术在应用程序的“关于”屏幕下按产品对程序集进行分组,这对我来说似乎工作得很好。

于 2010-08-12T21:14:51.167 回答
4

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

Microsoft 将一个名为的类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')

}

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

于 2010-09-08T09:42:17.663 回答
3

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

就此而言,您可以只拥有一个程序集名称的白名单——该列表在框架版本之间也是有限的和静态的。

于 2008-09-09T15:30:19.640 回答
2

安装 Visual Studio 时,您会在表单的各个子文件夹中获得参考程序集C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion}- 最有趣的可能是RedistList\FrameworkList.xml包含与给定框架版本一起提供的所有程序集名称列表的文件。

例如C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml,似乎包含所有 .NET 4.0 框架程序集的列表。

您可以轻松地使用这些文件来建立程序集的静态白名单。

于 2013-01-28T09:08:33.057 回答
1

您可以使用反射来查看程序集的发布者,并将其与程序集的路径协调。如果您发现一个程序集的发布者是 Microsoft,并且它存在于下面C:\Windows\Microsoft.NET\Framework的某个位置,那么可以肯定它是运行时的一部分。

再想一想,出版商甚至可能没有必要。该路径下的任何内容都应该是运行时的一部分(除非行为不端的应用程序在不应该出现的地方玩弄)。

于 2008-09-09T15:40:18.040 回答
1

如果您知道您的任何 DLL 都不会在 GAC 中,您可以检查每个程序集是否在 GAC 中。如果是,请不要复制它。如果不是,请复制它。Assembly 类上有一个名为 GlobalAssemblyCache 的属性。这在某些情况下显然比在其他情况下更有效。

于 2010-01-06T00:02:33.027 回答