如何从程序集名称或程序集类(或其他类似的类)中判断程序集是否属于.NET框架(即System.windows.Forms)的一部分?
到目前为止,我已经考虑了PublicKeyToken和CodeBase属性,但是对于整个框架而言,它们并不总是相同的。
我想要此信息的原因是要获取我的EXE文件正在使用的程序集的列表,这些程序集必须在客户端计算机上,因此我可以在不使用Visual Studio安装程序系统的情况下将正确的文件打包在安装程序文件中。问题是,我不想提取任何.NET框架程序集,而是希望它是一个自动过程,只要主要更新完成,该过程就很容易推出。
最终的解决方案是有一个IsFramework属性...:)
否,它不是以"系统"开头。您可以检查" 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 Assemblys \\\\ Microsoft \\\\ Framework \\\\ vVersionNumber \\
edistList
-
.NET 4.x:C:\\\\ Program Files(x86)\\
eference Assemblys \\\\ Microsoft \\\\ Framework.NETFramework \\\\ vVersionNumber \\
edistList
-
.NET Core:C:\\\\ Program Files(x86)\\
eference Assemblys \\\\ Microsoft \\\\ Framework.NETCore \\\\ vVersionNumber \\
edistList
我不得不处理完全相同的问题。不幸的是,到目前为止给出的所有答案都不足以安全地确定程序集是否是.NET Framework的一部分。
Microsoft将一个名为FXAssembly的类放入每个框架程序集的全局命名空间中,并带有一个指示版本的const字符串:
1 2 3 4 5 6
| .class private abstract auto ansi sealed beforefieldinit FXAssembly
extends [mscorlib]System.Object
{
.field assembly static literal string Version = string('2.0.0.0')
} |
使用此"标记"检查程序集是否为框架程序集。检查公钥也不会受到损害。
为此,我使用通过AssemblyProductAttribute嵌入到程序集中的产品名称。
1 2
| var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product =="Microsoft?? .NET Framework"); |
我正在使用此技术在应用程序的"关于"屏幕下按产品对部件进行分组,对我来说似乎工作得很好。
我怀疑最可靠,最通用的方法将是PublicKeyToken。是的,不止一个,但是它将是一个有限的列表,并且列表不会经常更改。
为此,您可能只需要一个程序集名称的白名单-该列表在框架的各个版本之间也将是有限的和静态的。
安装Visual Studio时,您可以通过C:\\Program Files (x86)\
eference Assemblies\\Microsoft\\Framework\\{FrameworkName}\\{FrameworkVersion}形式的各个子文件夹获得参考程序集-最有趣的是RedistList\\FrameworkList.xml文件,其中包含给定框架附带的所有程序集名称的列表版本。
例如C:\\Program Files (x86)\
eference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.0\
edistList\\FrameworkList.xml似乎包含所有.NET 4.0 Framework程序集的列表。
您可以轻松地使用这些文件来建立程序集的静态白名单。
如果您知道所有DLL都不在GAC中,则可以检查每个程序集是否都在GAC中。如果是这样,请勿复制它。如果不是,请复制它。 Assembly类上有一个名为GlobalAssemblyCache的属性。在某些情况下,这显然会比其他情况下更好。
您可以使用反射来查看程序集的发布者,并将其与程序集的路径进行协调。如果找到的程序集的发布者是Microsoft,并且存在于C:\\Windows\\Microsoft.NET\\Framework以下的某个位置,则可以肯定,它是运行时的一部分。
再三考虑,发布者甚至可能没有必要。该路径下的所有内容都应该是运行时的一部分(除非行为不当的应用程序在不应该出现的地方进行修饰)。