Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Klassenbibliothek für Desktop, Windows Store und Phone 8 - Welches Framework?
Ares
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Ares
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Ares,
Zitat
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!"
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3782
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Ares
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (02.10.2013 - 08:35:05):

Threads zusammengefügt

Ares
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

"Klassensammlung" um Klassen in mehreren Projekten zu verwenden - Gibt es sowas?

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Oder dich mal mit Architektur auseinandersetzen.

Das Vermeiden von vernünftiger Kapselung ist sicherlich nicht der richtige Weg bei einem größeren Projekt.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Passend zu meiner Antwort im anderen Thread, schau dir doch mal MVVMCross an.
Da hat sich mal jemand Gedanken dazu gemacht.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt

Moderationshinweis von herbivore (02.10.2013 - 08:36:50):

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

private Nachricht | Beiträge des Benutzers