如何从程序集名称或程序集类(或其他类似程序)判断程序集是否属于.NET框架(即System.windows.Forms
)?
到目前为止,我已经考虑了PublicKeyToken和CodeBase属性,但这些并不总是与整个框架相同。
我想要获取此信息的原因是为了获取我的EXE文件正在使用的程序集列表,这些程序集需要位于客户端计算机上,因此我可以在安装文件中打包正确的文件,而无需使用Visual Studio安装程序系统。问题是,我不想选择任何.NET框架程序集,我希望它是一个自动流程,只要主要更新完成就很容易推出。
最终的解决方案是有一个IsFramework属性......:)
答案 0 :(得分:4)
不,它不以“系统”开头。您可以检查“WindowsBase”,这是一个框架程序集。
您也不能检查PublicKeyToken,因为还有其他Microsoft程序集使用“默认”密钥签名,但它们不是.NET Framework(Visual Studio程序集)的一部分。
最好的方法是获取已安装的.NET框架的集合,并检查目标程序集是否属于其RedistList(RedistList\FrameworkList.xml
)。
FrameworkList.xml可以在:
中找到答案 1 :(得分:4)
为了实现这一点,我通过AssemblyProductAttribute使用程序集中嵌入的产品名称。
var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");
我正在使用此技术在应用程序的“关于”屏幕下按产品对程序集进行分组,它似乎对我来说很合适。
答案 2 :(得分: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')
}
使用此“标记”检查程序集是否为框架程序集。检查公钥也不会造成伤害。
答案 3 :(得分:3)
我怀疑最可靠和最通用的方法将是PublicKeyToken。是的,这不止一个,但它将是一个有限的列表,并且不会经常发生变化。
就此而言,您可能只有一个程序集名称的白名单 - 该列表在框架版本之间也将是有限的和静态的。
答案 4 :(得分:1)
您可以使用反射来查看程序集的发布者,并将其与程序集的路径进行协调。如果你找到一个发布者是Microsoft的程序集,并且它存在于C:\Windows\Microsoft.NET\Framework
之下,那么可以肯定它是运行时的一部分。
第二个想法,出版商可能甚至没有必要。该路径下的任何内容都应该是运行时的一部分(除非行为不当的应用程序在不应该的地方进行操作)。
答案 5 :(得分:1)
如果您知道您的任何DLL都不在GAC中,您可以检查每个程序集是否在GAC中。如果是,请不要复制它。如果不是,则复制它。 Assembly类中有一个名为GlobalAssemblyCache的属性。在某些情况下,这显然比在其他情况下更好。
答案 6 :(得分:1)
安装Visual Studio时,可以在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion}
形式的各个子文件夹中获取引用程序集 - 最有趣的事情可能是RedistList\FrameworkList.xml
文件,其中包含已发送的所有程序集名称的列表使用给定的框架版本。
E.g。 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml
似乎包含所有.NET 4.0的Framework程序集的列表。
您可以轻松地使用这些文件来建立静态白色程序集列表。