Laden...

Klassenbibliothek für Desktop, Windows Store und Phone 8 - Welches Framework?

Erstellt von Ares vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.772 Views
A
Ares Themenstarter:in
167 Beiträge seit 2005
vor 10 Jahren
Klassenbibliothek für Desktop, Windows Store und Phone 8 - Welches Framework?

Hallo,

eine App soll unter Windows Phone 8, als Windows Store App und (langfristig) auch als Desktop App laufen. Prinzipiell sind das ja drei verschiedene Versionen der gleichen App. Codeteile die in allen drei Versionen benötigt werden wollte ich in eine Klassenbibliothek stecken, die ich dann in allen drei Projekten verwenden kann.

Ich habe hierfür einfach mal die Vorlage "Portable Klassenbibliothek" verwendet, da die Beschreibung hierfür genau mein Szenario erfasst: "Ein Projekt zur Erstellung einer C#-Klassenbibliothek (.dll) die unter Windows, Silverlight und Windows Phone ausgeführt werden kann.".

In der Bibliothek habe ich dann die Unterstützung von ".NET Framework 4.5 und höher", "Windows Store apps", "Silverlight 5" und "Windows Phone 8" aktiviert.

Soweit so gut. Nun habe aber entsprechend einer Anleitung von Microsoft für eine Phone app versucht eine Datei aus dem App Package in den IsolatedStorage der App zu kopieren. Problem: Hierfür braucht man den Namespace System.IO.IsolatedStorage und der ist unbekannt, wenn die Bibliothek auf "Windows Store apps", "Silverlight 5" oder"Windows Phone 8" einschränkt.

Deaktiviert man "Windows Store apps" und "Silverlight 5" verendet die Portable Bibliothek also noch ".NET 4.5" und ".NET for Windows Phone 8".

In einer normalen (nicht portablen) Bibliothek ist nur ".NET 4.5" aktiv. Darin lässt sich System.IO.IsolatedStorage ohne Probleme nutzen.

In einem Projekt nach der Vorlage "Windows Phone 8" mit dem ".NET for Windows Phone 8" kann ich System.IO.IsolatedStorage ebenfalls ohne Probleme nutzen.

Warum kann ich System.IO.IsolatedStorage dann nicht in einer Portablen Bibliothek verwenden, die ".NET 4.5" UND ".NET for Windows Phone 8" verwendet?

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Ares,

keine Ahnung 😉

Aber du kannst im Portable Classlibrary eine Schnittstelle für den Dateizugriff erstellen und verwenden und diese dann in der Anwendung entsprechend ergänzen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
Ares Themenstarter:in
167 Beiträge seit 2005
vor 10 Jahren

Das ist klar. Aber die Aufgabe "Datei aus dem XAP Packet in den IsolatedStorage kopieren" müsste doch zumindest für eine Windows Phone App und eine Windows Store App identisch sein, oder nicht?

Entsprechend würde ich diesen Code gerne in eine Klassenbibliothek auslagern, die dann von beiden App-Versionen verwendet werden kann. Der Code soll also nur einmal geschrieben werden.

In einer Windows Store App kann ich System.IO.IsolatedStorage verwenden.
In einer Windows Phone App kann ich System.IO.IsolatedStorage verwenden.
In einer Portable Klassenbibliothek für Windows Phone UND Store kann ich System.IO.IsolatedStorage nicht verwenden...

Das verstehe ich nicht und wäre wirklich für jeden Hinweis dankbar.

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Ares,

In einer Portable Klassenbibliothek für Windows Phone UND Store

Phone und Store (WinRT) sind eben verschieden.

Zitat von: PCL Storage - Home
The full .NET Framework provides the standard file and directory APIs (in the System.IO namespace), Silverlight and Windows Phone provide isolated storage APIs, and WinRT provides storage APIs in the Windows.Storage namespace.

Schau dir mal PCL Storage an. Da wird im Grund der obige Vorschlag umgesetzt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

3.825 Beiträge seit 2006
vor 10 Jahren

Schau Dir zum Thema den Blog von Daniel Meixner an, den ich in Frankfurt auf einem Vortrag genau zu diesem Thema hören durfte :

Windows 8 + Windows Phone 8 Cross Platform App Development mit C#/XAML (Teil 1)

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

A
Ares Themenstarter:in
167 Beiträge seit 2005
vor 10 Jahren

Vielen Dank für den Link, dass ist wirklich eine sehr gute Erklärung. Ich denke ich werde dann auf die Portable Library in weiten Teilen verzichten und den gemeinsamen Code stattdessen in Klassen packen die dann von beiden Projekten referenziert werden.

Hinweis von herbivore vor 10 Jahren

Threads zusammengefügt

A
Ares Themenstarter:in
167 Beiträge seit 2005
vor 10 Jahren
"Klassensammlung" um Klassen in mehreren Projekten zu verwenden - Gibt es sowas?

Hallo,

ich will zwei Versionen einer App entwickeln: Eine für Windows Phone und eine für Windows Store.

In den beiden Versionen kann natürlich ein guter Teil des Codes wiederverwendet werden. Ich suche nun nach der besten Lösung um diesen gemeinsamen Code nur einmal zu schreiben und Zentral unterzubringen.

Mein erster Ansatz war die Verwendung einer Portable Klassenbibliothek. Es hat sich aber gezeigt, dass es zwischen den Framworks für Phone und RT zwei durchaus viele Gemeinsamkeiten aber auch viele Unterschiede gibt.

Teilweise kann zwar der gleiche Code verwendet werden, dieser muss dann aber für das jeweilige Ziel eigens compiliert werden. Die Verwendung einer gemeinsamen Bibliothek ist in diesem Fällen also nicht möglich (diese wird ja nur einmal erstellt).

Ich suche also nach einer Möglichkeit den "Einmal-Schreiben-Zweimal-Comilieren" möglichst gut und effektiv zu verwalten. Natürlich kann ich die Dateien CommonClass.cs einmal in das Phone-Projekt und einmal in das Store-Projekt einbinden. Aber es geht ja nicht nur um eine Klasse/Datei sondern ziemlich viele.

Optimal wäre eine "Klassensammlung" (den Namen habe ich mir selber ausgedacht), also einfach eine lose Menge von Klassen, die man dann als Ganzes in verschiedene Projekte einbinden kann, wo diese dann ganz normal mit compiliert wird.

Gibt es so etwas? Oder muss man wirklich jede Klasse/Datei manuell und einzeln in beide Projekte einbinden?

849 Beiträge seit 2006
vor 10 Jahren

Hallo,

also ich hatte das damals einmal für Silverlight und .net gemacht.

Ich habe 2 Projecte gemacht. In dem einen habe ich ganz normal meine Klassen erstellt, und in der anderen als Link eingebunden. Und falls dochmal was unterschiedlich war, habe ich mit precompile Anweisungen (#if SILVERLIGHT) gearbeitet. Hat für mich gut funktioniert.

Gruß

F
10.010 Beiträge seit 2004
vor 10 Jahren

Oder dich mal mit Architektur auseinandersetzen.

Das Vermeiden von vernünftiger Kapselung ist sicherlich nicht der richtige Weg bei einem größeren Projekt.

F
10.010 Beiträge seit 2004
vor 10 Jahren

Passend zu meiner Antwort im anderen Thread, schau dir doch mal MVVMCross an.
Da hat sich mal jemand Gedanken dazu gemacht.

16.832 Beiträge seit 2008
vor 10 Jahren

Das Vorgehen von unconnected ist hier üblich.
Ich verwende das vor allem für verschiedene .NET Versionen.

Dabei sieht meine Project-Config folgendermaßen aus:

 <PropertyGroup Condition="'$(Framework)' == 'NET35'">
    <DebugType>pdbonly</DebugType>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <Optimize>true</Optimize>
    <DefineConstants>NET20_OR_GREATER; NET30_OR_GREATER; NET35; NET35_OR_GREATER</DefineConstants>
    <OutputPath>_Output\$(Configuration)\$(Framework)</OutputPath>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Framework)' == 'NET40'">
    <DebugType>pdbonly</DebugType>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <Optimize>true</Optimize>
    <DefineConstants>NET20_OR_GREATER; NET30_OR_GREATER; NET35_OR_GREATER; NET40; NET40_OR_GREATER</DefineConstants>
    <OutputPath>_Output\$(Configuration)\$(Framework)</OutputPath>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Framework)' == 'NET45'">
    <DebugType>pdbonly</DebugType>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <Optimize>true</Optimize>
    <DefineConstants>NET20_OR_GREATER; NET30_OR_GREATER; NET35_OR_GREATER; NET40_OR_GREATER; NET45; NET45_OR_GREATER</DefineConstants>
    <OutputPath>_Output\$(Configuration)\$(Framework)</OutputPath>
  </PropertyGroup>
  <Target Name="AfterBuild">
    <MSBuild Condition="'$(Framework)' == 'NET30'" Projects="$(MSBuildProjectFile)" Properties="Framework=NET20" RunEachTargetSeparately="true" />
    <MSBuild Condition="'$(Framework)' == 'NET35'" Projects="$(MSBuildProjectFile)" Properties="Framework=NET30" RunEachTargetSeparately="true" />
    <MSBuild Condition="'$(Framework)' == 'NET40'" Projects="$(MSBuildProjectFile)" Properties="Framework=NET35" RunEachTargetSeparately="true" />
    <MSBuild Condition="'$(Framework)' == 'NET45'" Projects="$(MSBuildProjectFile)" Properties="Framework=NET40" RunEachTargetSeparately="true" />
  </Target>

Damit das ganze auch sauber funktioniert Rechtklick auf die Solution, dann Batch Build und Build All

Und mit den If-bedigungen #IF NET40_OR_GREATER trenne ich eben zB Methoden, die nachher unterhalb von NET40 einfach nicht enthalten sind.
Alternativ kannst Du eine Klasse in Projekt A erstellen und dann via Linking in ein anderes Projekt einbinden; sodass Änderungen in allen anderen Nachgezogen werden. Das machen auch einige Leute hier im Forum IIRC.

Hinweis von herbivore vor 10 Jahren

Nötigenfalls müssen die Leerzeichen hinter den Semikolons entfernt werden.