2016-03-20 9 views
23

Für die plattformübergreifende Entwicklung versuche ich, eine gemeinsam genutzte .NET Core-Bibliothek zu erstellen. Ich habe die Projektvorlage Class Library (package) in VS 2015 verwendet. Meine Bibliothek muss einige Reflektionsmechanismen verwenden, die mir aus dem vollständigen .net 4-Framework bekannt sind, aber ich weiß jetzt nicht, wie ich auf diese in einer .NET Core-Bibliothek zugreifen kann. Im Einzelnen:Verwenden von Reflection in .NET Core

  • Delegate Der Typ hat eine Eigenschaft, die eine MethodMethodInfo Objekt zurückgibt.
  • Die Type Klasse hat eine BaseType Eigenschaft, FilterName Eigenschaft, InvokeMember Methode und FindMembers Methode, die ich in .NET Core nicht erreichen kann.

Ich habe NuGet Pakete, die angeblich die Reflexion Stücke, die ich brauche haben:

"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" 
} 

ich auch using System.Reflection hinzugefügt haben, aber ich bin immer noch Fehlermeldungen erhalten, die nicht definiert sind diese Eigenschaften und Typen zeigen, dass.

Was mache ich falsch?

Falls es relevant, auf derselben Maschine mit dem Befehl dnvm list zeigt:

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 

Die oben ist genau das, was ich will ... oder zumindest das, was ich denke, ich will. ;)

+0

.net Core ist noch in der Entwicklung und ist nicht vollständig. Es ist möglich, dass System.Reflection noch nicht in .net core portiert ist. – Saleem

+2

Zumindest für den 'BaseType' können Sie' type.GetTypeInfo(). BaseType' verwenden, da seit WinRT/UWP (das ist ungefähr auf was .NET Core basiert, die 'System.Runtime '). Viele der Standardaufrufe wurden hinter 'GetTypeInfo()' und ähnlichen Methoden entfernt. – Tseng

+0

Wann bekommen Sie Fehler? Was sind diese Fehler? –

Antwort

21

Kurzantwort

Was mache ich falsch?

Sie versuchen, auf Member zuzugreifen, die in .NET 4.5.1, aber nicht in 5.4 verfügbar sind.

4.x      Workaround in 5.x/Core 

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

Snip direkt von Visual Studio.

Visual Studio sagt uns dies, wenn wir die Maus über den Fehler bewegen.

ype.BaseType is not available...

.NET Portabilität Bericht

Es lohnt sich auch bei der .NET Portability Analyzer suchen. Es ist eine Erweiterung, die wir von der Visual Studio Gallery installieren können.

ausgeführt, dass zum Beispiel Type.BaseType nicht verfügbar ist und empfiehlt eine Problemumgehung.

.NET Portability Analyzer output

3

Ich benutze .net Core 1.0. Versuchen Sie, das Snippet von project.json zu verfolgen und zu sehen, ob es für Sie funktioniert. Ich habe auch bemerkt, dass Sie Beta-API verwenden, also wenn möglich weit weg von der Beta bleiben.

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

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

    "frameworks": { 
     "dnxcore50": { } 
    } 
} 
+0

'NETStandard.Library' ist nicht von NuGet verfügbar; Ich kann es nicht benutzen. Wo hast du es her? Offensichtlich [es ist nicht an einem veröffentlichten Ort] (https://github.com/dotnet/cli/issues/535). Was genau ist "NETStandard.Library"? Ich habe keine Artikel oder Dokumente darüber gefunden. –

+0

ahh, du musst den Befehl dotnet resotre ausführen. Siehe https://dotnet.github.io – Saleem

+0

Ich habe 'dnvm restore' ein paar Wochen vor dem Erstellen dieses Projekts ausgeführt. Ich habe meine Frage aktualisiert, um 'dnvm list' Ergebnisse auf meinem Rechner anzuzeigen. Sagst du, dass das * immer noch * nicht gut genug ist? –