web-dev-qa-db-ja.com

.NET CoreでReflectionを使用する

クロスプラットフォーム開発では、.NET Core共有ライブラリを作成しようとしています。 VS 2015でClass Library (package)プロジェクトテンプレートを使用しました。完全な.net 4フレームワークで熟知しているいくつかのリフレクションメカニズムをライブラリで使用する必要がありますが、でこれらにアクセスする方法はありません。 NET Coreライブラリ。具体的には:

  • Delegate型には、Methodオブジェクトを返すMethodInfoプロパティがあります。
  • Typeクラスには、BaseTypeプロパティ、FilterNameプロパティ、InvokeMemberメソッド、および.NET Coreで到達できないFindMembersメソッドがあります。 。

必要なリフレクションピースが含まれていると言われるNuGetパッケージを追加しました。

"frameworks": {
  "net451": {
    "dependencies": {
      "System.Reflection": "4.1.0-beta-23516",
      "System.Reflection.Extensions": "4.0.1-beta-23516",
      "System.Reflection.Primitives": "4.0.1-beta-23516",
    }
  },
  "dotnet5.4": {
    "dependencies": {
      "Microsoft.CSharp": "4.0.1-beta-23516",
      "System.Collections": "4.0.11-beta-23516",
      "System.Linq": "4.0.1-beta-23516",
      "System.Reflection": "4.1.0-beta-23516",
      "System.Reflection.Extensions": "4.0.1-beta-23516",
      "System.Reflection.Primitives": "4.0.1-beta-23516",
      "System.Runtime": "4.0.21-beta-23516",
      "System.Threading": "4.0.11-beta-23516"
    }
  }
},
"dependencies": {
  "System.Reflection.TypeExtensions": "4.1.0-beta-23516"
}

using System.Reflectionも追加しましたが、これらのプロパティと型が未定義であることを示すエラーが引き続き表示されます。

何が間違っていますか?

関連する場合は、この同じマシンでコマンドdnvm listが表示されます:

Active Version           Runtime Architecture OperatingSystem Alias  
------ -------           ------- ------------ --------------- -----  
    1.0.0-rc1-update1 clr     x64          win                    
    1.0.0-rc1-update1 clr     x86          win                    
    1.0.0-rc1-update1 coreclr x64          win                    
*    1.0.0-rc1-update1 coreclr x86          win             default

上記はまさに私が欲しいものです...または少なくとも私が欲しいと思うものです。 ;)

26
Brent Arias

短い答え

何が間違っていますか?

.NET 4.5.1では使用できるが5.4では使用できないメンバーにアクセスしようとしています。

4.x                        Workaround in 5.x/Core

Delegate.Method.           Delegate.GetMethodInfo()
Type.BaseType.             Type.GetTypeInfo()
Type.FilterName            -
Type.InvokeMember          -
Type.FindMembers           -

Visual Studioから直接切り取ります。

エラーの上にマウスを置くと、Visual Studioからこれが通知されます。

ype.BaseType is not available...

.NETポータビリティレポート

。NET Portability Analyzer もご覧ください。 Visual Studio Gallery からインストールできる拡張機能です。

実行すると、たとえば、Type.BaseTypeは利用できず、回避策を推奨します。

.NET Portability Analyzer output

22
Shaun Luttin

元のコードを#if ... #else ... #endifステートメントでいっぱいにしたくない場合は、 https://www.nuget.org/packages/ReflectionBridge/ のようなヘルパーライブラリを使用できます。 TypeとTypeInfoの違いの橋渡しを定義します。

https://github.com/StefH/ReflectionBridge のソースコード)

6
Stef Heyenrath

私は.net Core 1.0を使用しています。 project.jsonのスニペットをたどってみて、うまくいくかどうかを確認してください。また、ベータ版APIを使用していることに気づいたので、可能であればベータ版から離れてください。

{
    "version": "1.0.0-*",
    "compilationOptions": {
        "emitEntryPoint": true
    },

    "dependencies": {
        "NETStandard.Library": "1.0.0-rc2-23811",
        "System.Reflection.TypeExtensions": "4.0.0"
    },

    "frameworks": {
        "dnxcore50": { }
    }
}
3
Saleem