Pour le développement multiplateforme, j'essaie de créer une bibliothèque partagée .NET Core. J'ai utilisé le modèle de projet Class Library (package)
dans VS 2015. Ma bibliothèque doit utiliser quelques mécanismes de réflexion que je connais depuis le framework .net 4 complet, mais je ne sais pas maintenant comment y accéder dans a. Bibliothèque NET Core. Plus précisément:
Delegate
possède une propriété Method
qui renvoie un objet MethodInfo
.Type
a une propriété BaseType
, une propriété FilterName
, une méthode InvokeMember
et une méthode FindMembers
que je ne peux pas atteindre dans .NET Core .J'ai ajouté des packages NuGet qui auraient les éléments de réflexion 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 également ajouté using System.Reflection
, mais je reçois toujours des erreurs qui indiquent que ces propriétés et types ne sont pas définis.
Qu'est-ce que je fais mal?
Si cela est pertinent, sur cette même machine, la commande dnvm list
spectacles:
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
Ce qui précède est exactement ce que je veux ... ou du moins ce que je pense que je veux. ;)
Qu'est-ce que je fais mal?
Vous essayez d'accéder aux membres disponibles dans .NET 4.5.1 mais pas dans 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 nous le dit si nous passons notre souris sur l'erreur.
Il vaut également la peine de regarder . NET Portability Analyzer . Il s'agit d'une extension que nous pouvons installer à partir de Visual Studio Gallery .
Son exécution nous indique, par exemple, que Type.BaseType
n'est pas disponible et recommande une solution de contournement.
Si vous ne voulez pas que votre code d'origine soit plein de #if ... #else ... #endif
instructions, vous pouvez utiliser une bibliothèque d'aide comme https://www.nuget.org/packages/ReflectionBridge/ qui fournit des extensions qui définissent un pont pour les différences entre Type et TypeInfo.
(Code source sur https://github.com/StefH/ReflectionBridge )
J'utilise .net Core 1.0. Essayez l'extrait suivant de project.json et voyez si cela fonctionne pour vous. J'ai également remarqué que vous utilisez l'API bêta, donc si possible restez loin de la bêta.
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"NETStandard.Library": "1.0.0-rc2-23811",
"System.Reflection.TypeExtensions": "4.0.0"
},
"frameworks": {
"dnxcore50": { }
}
}