À l'aide de Réflexion .NET de Base
Pour le développement cross plate-forme, je suis en train de faire un .NET de Base de la bibliothèque partagée. J'ai utilisé le Class Library (package)
modèle de projet dans VS 2015. Ma bibliothèque a besoin d'utiliser un couple de réflexion mécanismes, je suis familier avec de la pleine .net 4 cadre, mais je ne sais pas maintenant comment accéder à ces dans une .NET de Base de la bibliothèque. Plus précisément:
- La
Delegate
type a unMethod
propriété qui renvoie unMethodInfo
objet. - La
Type
classe a unBaseType
propriété,FilterName
propriété,InvokeMember
méthode etFindMembers
méthode que je ne peut pas atteindre dans .NET de Base.
J'ai ajouté les packages NuGet qui auraient la réflexion pièces dont j'ai besoin:
"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"
}
J'ai aussi ajouté using System.Reflection
, mais je suis encore à obtenir des erreurs qui indiquent que ces propriétés et les types ne sont pas définis.
Ce que je fais mal?
Dans le cas où il est pertinent, sur cette même machine, la commande dnvm list
montre:
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
Le dessus est exactement ce que je veux...ou au moins ce que je pense que je veux. 😉
- .net de Base est encore en cours de développement et n'est pas complète. Il est possible Système.La réflexion n'est pas porté dans .net de base encore.
- Au moins pour le
BaseType
vous pouvez utilisertype.GetTypeInfo().BaseType
, c'est là où il a été déplacé depuis WinRT/UWP (qui est à peu près sur quoi .NET de Base est basé sur leSystem.Runtime
). Beaucoup de la norme appels ont été retirés derrièreGetTypeInfo()
et des méthodes similaires - Lorsque vous obtenez des erreurs? Quelles sont ces erreurs?
Vous devez vous connecter pour publier un commentaire.
Réponse Courte
Vous tentez d'accéder à des membres qui sont disponibles dans .NET 4.5.1 mais pas dans 5.4.
Snip directement à partir de Visual Studio.
Visual Studio nous dit si nous passez la souris sur l'erreur.
.NET Portabilité Rapport
Il est également intéressant de regarder l' .NET la Portabilité de l'Analyseur. C'est une extension que l'on peut installer à partir de la Visual Studio Gallery.
Marche, il nous dit, par exemple, que
Type.BaseType
n'est pas disponible et recommande une solution de contournement.Si vous ne voulez pas que votre code original plein de
#if ... #else ... #endif
états, vous pouvez utiliser une bibliothèque d'aide comme https://www.nuget.org/packages/ReflectionBridge/ qui propose quelques extensions qui définissent un pont pour les différences entre le Type et TypeInfo.(Le code Source à https://github.com/StefH/ReflectionBridge)
Je suis en utilisant .net Core 1.0. Essayez l'extrait de code suivant de projet.json et voir si fonctionne pour vous. J'ai aussi remarqué que vous utilisez la version bêta de l'API, donc si possible rester à façon à partir de la bêta.
NETStandard.Library
n'est pas disponible à partir de NuGet, je suis incapable de l'utiliser. D'où vient-il? De toute évidence, il n'est pas publiée dans un emplacement. Aussi, quelle est exactement laNETStandard.Library
? Je n'ai pas trouvé d'articles ou de documents écrits sur le sujet.dnvm restore
quelques semaines avant la création de ce projet. J'ai mis à jour ma question afin de montrerdnvm list
résultats sur ma machine. Vous dites que c'est toujours ce n'est pas assez bon?