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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

为了实现此目的,我通过 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')

}

使用此“标记”来检查程序集是否是框架程序集。检查公钥也不会有什么坏处。

不,它不是以“System”开头。您可以检查“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 edistList
  • .NET 3.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework\v版本号 edistList
  • .NET 4.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETFramework\v版本号 edistList
  • .NET 核心:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETCore\v版本号 edistList

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

安装 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 框架程序集的列表。

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

您可以使用反射来查看程序集的发布者,并将其与程序集的路径进行协调。如果您找到发布者为 Microsoft 的程序集,并且该程序集存在于下面的某个位置 C:\Windows\Microsoft.NET\Framework 这是一个安全的赌注,它是运行时的一部分。

再想一想,出版商可能根本就没有必要。该路径下的任何内容都应该是运行时的一部分(除非行为不当的应用程序在不应该出现的地方进行欺骗)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top