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

Dav*_*ell 16 .net reflection frameworks assemblies

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

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

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

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

Ion*_*rel 6

不,它不是以“系统”开头。您可以检查“ 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


jpi*_*son 5

为了实现这一点,我通过 AssemblyProductAttribute 使用嵌入在程序集中的产品名称。

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

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


Cur*_*her 3

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

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