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

时间:2008-09-09 15:18:15

标签: .net reflection frameworks assemblies

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

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

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

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

7 个答案:

答案 0 :(得分:4)

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

答案 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程序集的列表。

您可以轻松地使用这些文件来建立静态白色程序集列表。