代码之家  ›  专栏  ›  技术社区  ›  Ezombort

如何确定Web应用程序中的客户端.NET框架版本?

  •  8
  • Ezombort  · 技术社区  · 15 年前

    我需要确定Web应用程序中的客户端.NET框架版本。我以部分信任方式运行,因此无法读取文件系统或注册表( Is there an easy way to check .net framework verison using C#? )

    • system.environment.version返回运行时版本,因此无法使用该版本。

    • 我不能使用javascript

    目前我能想到的唯一方法是尝试加载.NET 3.5 dll并捕获异常,但这听起来不是很好。

    有什么建议吗?

    更新:

    Request.Browser.ClrVersion Request.Browser.GetClrVersions() 将返回客户端上安装的.NET Framework版本。

    4 回复  |  直到 10 年前
        1
  •  5
  •   Steven    10 年前

    你可以使用 Request.Browser.ClrVersion 属性以获取客户端的最高.NET版本和 Request.Browser.GetClrVersions() 方法获取所有已安装的.NET版本。

    这些方法简单地分析 Request.ServerVariables("HTTP_USER_AGENT") 服务器变量。

    但请注意,浏览器(或用户或黑客)可能会将他希望的任何内容放入字符串中,因此您将没有100%的准确性。

        2
  •  3
  •   Ikaso    15 年前

    我认为你应该做如下的事情 msdn article suggests . 它使用Java脚本进行.NETFramework的检测。

        3
  •  2
  •   ata    15 年前

    一种方法是从当前程序集获取引用的程序集列表。然后查找mscorlib.dll(或您确定已加载的任何其他.NET程序集),并获取该程序集的版本。这样您就可以知道所安装的框架的版本。

    试试这个代码:

    Version version = null;
    AssemblyName[] names = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
    foreach (AssemblyName name in names)
    {
          if (name.Name == "mscorlib")
          {
                version = name.Version;
          }
    }
    

    这完全取决于您选择从中获取版本的程序集的可用性。

    或者看看这个 CodeProject 文章。在本文中,他/她引用了 Junfeng Zhang 它使用非托管代码来确定clr版本。

        4
  •  1
  •   Patrick from NDepend team    13 年前

    我使用下面的类,直接从 主体() 方法入口点,然后可以选择通过messagebox或console.writeline通知用户。此代码基于以下事实:

    • 班级 System.Linq.Enumerable 与.NET v3.5一起出现
    • 此类在程序集中声明 系统.COL.DLL 也出现在.NET 3.5版中
    • 例外 文件未找到异常 在找不到程序集时引发。

    static class DotNetFx35Checker {
       [MethodImpl(MethodImplOptions.NoInlining)]
       internal static bool IsDotNetFx35Available(out string failureReason, out string productName) {
          productName = "MyProductName";
          try {
             TestLinqAvailable();
             failureReason = null;
             return true;
          } catch (System.IO.FileNotFoundException) {
             var productVersion = Assembly.GetExecutingAssembly().GetName().Version;
             var productNameAndVersion = productName + " v" + productVersion.Major + "." + productVersion.Minor;
             failureReason = "To run " + productNameAndVersion + ", please download and install .NET Fx v3.5 or upper version.";
             return false;
          }
       }
       [MethodImpl(MethodImplOptions.NoInlining)]
       private static void TestLinqAvailable() {
          var i = System.Linq.Enumerable.Count(new int[] { 1 });
       }
    }
    
    推荐文章