C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■93080 / 2階層)  .NETのバージョンを取得するには?
□投稿者/ KOZ (43回)-(2019/11/19(Tue) 11:37:36)
結局 Reflection の嵐になってしまいました。
2.0 と 3.5 は情報が埋め込まれてないようです。

using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;

static class Program
{
    [STAThread]
    static void Main() {
        var asmHelper = new ReflectionHelper(Assembly.GetExecutingAssembly());
        var attributes = asmHelper.Invoke("GetCustomAttributesData");
        if (attributes == null) {
            Debug.Print(".NET Framework 2.0/3.5");
        } else {
            foreach (var attr in (IEnumerable)attributes) {
                var attrHelper = new ReflectionHelper(attr);
                var attributeType = new ReflectionHelper(attrHelper.GetProperty("AttributeType"));
                var fullName = (string)attributeType.GetProperty("FullName");
                if (fullName == "System.Runtime.Versioning.TargetFrameworkAttribute") {
                    var namedArguments = new ReflectionHelper(attrHelper.GetProperty("NamedArguments"));
                    var item = new ReflectionHelper(namedArguments.GetProperty("Item", 0));
                    var typedValue = new ReflectionHelper(item.GetProperty("TypedValue"));
                    Debug.Print((string)typedValue.GetProperty("Value"));
                }
            }
        }
    }

    private class ReflectionHelper
    {
        private object Target;
        private Type TargetType;

        public ReflectionHelper(object target) {
            Target = target;
            TargetType = target.GetType();
        }

        public object GetProperty(string propertyName, params object[] parameters) {
            var pi = TargetType.GetProperty(propertyName);
            if (pi != null) {
                return pi.GetValue(Target, parameters);
            }
            return null;
        }

        public object Invoke(string methodName, params object[] parameters) {
            var mi = TargetType.GetMethod(methodName);
            if (mi != null) {
                return mi.Invoke(Target, parameters);
            }
            return null;
        }
    }
}

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: .NETのバージョンを取得するには? /KOZ →Re[3]: .NETのバージョンを取得するには? /コリアン
 
上記関連ツリー

.NETのバージョンを取得するには? / コリアン (19/11/18(Mon) 11:58) #93061
Re[1]: .NETのバージョンを取得するには? / 魔界の仮面弁士 (19/11/18(Mon) 13:28) #93067
Re[1]: .NETのバージョンを取得するには? / みい (19/11/18(Mon) 13:21) #93066
│└ Re[2]: .NETのバージョンを取得するには? / コリアン (19/11/18(Mon) 13:49) #93068
│  ├ Re[3]: .NETのバージョンを取得するには? / kaina (19/11/18(Mon) 14:17) #93070
│  └ Re[3]: .NETのバージョンを取得するには? / 魔界の仮面弁士 (19/11/18(Mon) 15:34) #93072
Re[1]: .NETのバージョンを取得するには? / KOZ (19/11/19(Tue) 10:09) #93079
  └ .NETのバージョンを取得するには? / KOZ (19/11/19(Tue) 11:37) #93080 ←Now
    └ Re[3]: .NETのバージョンを取得するには? / コリアン (19/11/25(Mon) 19:28) #93167
      └ Re[4]: .NETのバージョンを取得するには? / コリアン (19/11/25(Mon) 19:46) #93168 解決済み
        └ Re[5]: .NETのバージョンを取得するには? / コリアン (19/11/25(Mon) 19:55) #93170
          └ Re[6]: .NETのバージョンを取得するには? / コリアン (19/11/25(Mon) 20:08) #93171
            └ Re[7]: .NETのバージョンを取得するには? / KOZ (19/11/26(Tue) 08:52) #93178
              └ Re[8]: .NETのバージョンを取得するには? / コリアン (19/11/27(Wed) 22:34) #93203 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信