2016-02-08 9 views
8

Zajmuję się tworzeniem biblioteki do użytku z WPF i Windows 10. Mam problemy z pobieraniem go do kompilacji na drugim. Oto niektóre z kodu:Jak korzystać z klas środowiska wykonawczego Windows w bibliotekach .NET Core?

project.json

{ 
    "frameworks": { 
     "net46": { 
      "frameworkAssemblies": { 
       "WindowsBase": "4.0.0.0" 
      } 
     }, 
     "netcore50": { 
      "dependencies": { 
       "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" 
      } 
     } 
    } 
} 

Dependency.cs

using System; 
using System.Collections.Generic; 
#if NET46 
using System.Windows; // .NET Framework 4.6 
#elif NETCORE50 
using Windows.UI.Xaml; // Windows 10 apps 
#endif 

public static class Dependency 
{ 
    public static DependencyProperty Register<T, TOwner>(string name, PropertyChangedCallback<T, TOwner> callback) 
     where TOwner : DependencyObject 
    { 
     // Code here.... 
    } 
} 

Chociaż kompiluje grzywny za net46 (która jest tradycyjnym .NET Framework) , Mam problem z uzyskaniem go do pracy pod netcore50 (z którego mogą korzystać aplikacje systemu Windows 10). Z jakiegoś powodu wygląda na to, że typy takie jak DependencyProperty lub DependencyObject nie są zawarte w tej konfiguracji.

Czy istnieje kompatybilny pakiet NuGet zgodny z netcore50, który zawiera te typy, aby móc korzystać z nich z mojej biblioteki?

Dzięki za pomoc.


EDIT: po prostu wpisane w DependencyProperty w VS i uderzyć F12. Wygląda na to, że ten typ występuje w zestawie Windows 2000 Server.

+0

Całkiem pewne, że nie jest to możliwe - rzeczy takie jak WPF nie są przeznaczone do krzyżowania platformy afaik, choć można spojrzeć na projekty takie jak Perspex, jeśli są one interesujące. – Warty

+0

@Warty Myślę, że możesz .NET Core nie oznacza, że ​​możesz tworzyć biblioteki autonomiczne dla platformy, to znaczy * można je * tworzyć. na przykład Nadal można używać pakietów takich jak 'Microsoft.Win32.Registry'. –

Odpowiedz

5

W końcu rozwiązano problem sam! (Jeśli szukasz szybkiej odpowiedzi, możesz przewinąć w dół.)

Przypomniałem sobie przez przypadek, że .NET Core GitHub repo miał kilka bibliotek specyficznych dla WinRT, takich jak System.Runtime.WindowsRuntime. Więc udałem się tam, aby zobaczyć, jak to zrobili.

Wygląda na to, że używają jakiegoś hostowanego wewnętrznie "targeting pack", który zawiera pojedynczy plik Windows.winmd (zawierający wszystkie typy w środowisku wykonawczym systemu Windows), aby uzyskać ten efekt. Niestety, pakiet jest hostowany na prywatnym kanale NuGet przeznaczonym tylko dla zespołu .NET Core, więc nie mogę go używać.

Otworzyłem problem na ten temat w repozytorium CoreFX here, więc mogę poprosić Microsoft o oficjalne rozwiązanie tego problemu. W międzyczasie wziąłem sprawy w swoje ręce. Znalazłem wszystkie wersje Windows.winmd na moim laptopie i przesłałem je jako pakiety NuGet.Oto one:

Można ich używać tak:

"frameworks": { 
    ".NETPortable,Version=v4.5,Profile=Profile32": { 
     "dependencies": { 
      "Target.WindowsRuntime": "8.1.2" 
     } 
    } 
} 

Po tym, będziesz mógł coś napisać tak:

using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 

public class MyApp : Application 
{ 
    public MyApp() 
    { 
     var button = new Button(); 
     button.Content = "Hello, world!"; 
    } 
} 

i to po prostu zadziała.

0

WPF Nie jest kompatybilny z .net Core ani Uniwersalnymi Aplikacjami W10, według mojej wiedzy tylko aplikacje konsolowe i aplikacje internetowe są obecnie kompatybilne z .net core, powinieneś móc nadal korzystać z nowej bazy kodu z nowy system projektowy, ale będziesz musiał usunąć rdzeń .net ze swojej konfiguracji, aby skompilować , jeśli chcesz użyć .net core z linuxem z aplikacją na komputer, będziesz musiał po prostu poczekać lub użyć kompatybilnej ramy aplikacji okienkowej (jeśli wszystkie są jeszcze dostępne), powinieneś być w stanie użyć platformy opartej na platformach wieloplatformowych wokół html/js, takich jak Electron lub Cordova (nie wiesz na tym, czy istnieje struktura aplikacji dla komputerów stacjonarnych z Cordova)

+0

Z tego, co wiem, Perspex jest obecnie w jedynej bibliotece .NET Core. –

+0

Niestety, nie sądzę, że to prawda. .NET Core to ** nie ** o pisaniu czegoś, co może działać na każdej platformie, tak robi PCL. Zamiast tego kompiluje się raz dla każdej konfiguracji określonej w pliku ** project.json **. Pozwala to na wykonywanie w kodzie rzeczy takich jak '#if NET46' i wyspecjalizowanie kodu dla każdej platformy. –

Powiązane problemy