如何确定 DLL 是不是需要完整的 .NET 4 或仅需要客户端配置文件

Posted

技术标签:

【中文标题】如何确定 DLL 是不是需要完整的 .NET 4 或仅需要客户端配置文件【英文标题】:How to determine if a DLL requires Full .NET 4 or just Client Profile如何确定 DLL 是否需要完整的 .NET 4 或仅需要客户端配置文件 【发布时间】:2012-06-26 13:20:22 【问题描述】:

当使用第三方程序集时,我需要一种方法来检测它们是否需要完整的 .NET 4 或仅需要 .NET 4 客户端配置文件。

我已经看到了其他方法来检测引用的 .NET 版本 Determine .NET Framework version for dll,但该问题中概述的方法并未显示如何检测客户端配置文件与完整配置文件。有可能吗?

我正在寻找任何解决方案,它不一定是代码/运行时解决方案。

【问题讨论】:

您可以手动检查那些未包含在客户端配置文件中的引用(或编写一个工具来为您执行此操作!)。我不确定开箱即用的方法。 AFAIK,当只使用程序集时,只需要客户端配置文件,开发/调试需要完整的 .net 框架。 任何解决方案都可以,不必只是代码。 @Furqan,这不是真的,客户端配置文件是一个精简版本,足以运行大多数控制台/桌面应用程序。即使在生产中,服务器应用程序通常也需要 Full。例如,System.Web 在 Client Profile 中不存在,但在 Full 中存在。这对于任何与任何 aspx/mvc/wcf/etc 相关的内容都是必需的。 【参考方案1】:

请注意,下面的解决方案是特定于 .NET 4.0 框架的,TargetFrameworkAttribue 是 4.0 的新内容。

我编译了两个应用程序,一个针对客户端框架,另一个针对完整。我在 ildasm.exe 中打开了它们,发现它们都应用了TargetFrameworkAttribute。您可以简单地使用反射来查看值:

using System;
using System.Linq;
using System.Runtime.Versioning;

class Program

    static void Main(string[] args)
    
        var a = System.Reflection.Assembly.GetExecutingAssembly();
        var att = a.GetCustomAttributes(false).OfType<TargetFrameworkAttribute>().Single();

        Console.WriteLine(att.FrameworkDisplayName);
        Console.Read();
    

更新:确实,针对“.NET Framework 3.5 Client Profile”编译应用程序确实包含该属性(代码再也看不到它,而且 ildasm 也没有它)。除了您链接的其他答案外,我不知道在这种情况下如何确定目标框架。

为了避免对你的代码库施加认为毫无意义的限制,我会让生活更轻松,并简单地针对完整的框架。如果客户端具有安装客户端配置文件的权限,那么完整框架也是如此——它只是稍微大一点(我发现一个消息来源说它只大了 15%,从而否定了大部分“更小的客户端包”的好处, 41MB 而不是 48MB)。您的来电。

【讨论】:

以上是关于如何确定 DLL 是不是需要完整的 .NET 4 或仅需要客户端配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何确定哪些正在运行的应用程序正在使用 .Net

如何检查客户的 PC 是不是存在 .Net 相关的 DLL?

我是不是需要注册 COM dll 才能在 .NET 项目中引用它?

带有 .NET 的 C++ dll:内存泄漏是确定的吗?

.net中如何引用Dll文件?

如何将 C/C++ dll 导入 .NET 应用程序