Fehler beim Kompilieren der UWP-App: "Die Verwendung des Windows-Namespace ist reserviert."

8

Ich erstelle eine UWP-Anwendung für Windows 10, die die Speech-APIs verwendet, aber beim Kompilieren bekomme ich einen seltsamen Fehler.

Das Szenario ist das:

  • Ein PCL-Projekt, das auf Windows 8.1 abzielt (Als ich das Projekt erstellte, setzte ich Windows 10 als Ziel, aber Visual Studio stufte Windows 8.1 herunter, weil "sie die gleichen portablen APIs unterstützen") und mit einem Verweis auf " Windows.Foundation.UniversalApiContract ", weil es die Speech-APIs (Windows.Media.SpeechRecognition und Windows.Media.SpeechSynthesis) enthält.

  • Eine UWP-Anwendung mit einem Verweis auf das PCL-Projekt. Die UWP verwendet keine Speech APIs, ich verwende sie nur für das PCL-Projekt.

Das PCL-Projekt wurde erfolgreich erstellt, aber wenn ich UWP-Projekt erstelle, gibt es viele Fehler wie diese "Die .winmd-Datei 'Windows.Foundation.UniversalApiContract.winmd' enthält den Typ 'XXXXX'. Die Verwendung des Windows-Namespace ist reserviert." und ich denke, der Fehler wird durch die Referenzen des PCL-Projekts verursacht.

Ich habe versucht, die Speech-APIs direkt von der UWP-App aufzurufen und es scheint zu funktionieren, aber ich mag es nicht, weil ich die Anwendungslogik lieber in einem anderen Bibliotheksprojekt habe, falls ich die App auf andere Plattformen portiere / p>

Ich weiß nicht, was ich machen soll. Wenn die PCL auf Windows 8.1 ausgerichtet ist, muss ich in der Lage sein, Speech APIs zu verwenden, ohne Referenzen wie im UWP-Projekt hinzuzufügen, oder? Gibt es eine Problemumgehung, um zu erzwingen, dass die PCL nur auf Windows 10 ausgerichtet ist? Ich liege falsch und sollte stattdessen einen anderen Projekttyp als PCL verwenden?

    
Branyac 08.09.2016, 01:00
quelle

2 Antworten

7

Sie können Windows.Foundation.UniversalApiContract nicht in Ihrer PCL referenzieren. Da es sich um eine portable Klassenbibliothek handelt, kann sie nicht auf eine reine Windows-Bibliothek verweisen. Um Windows API zu verwenden, benötigen Sie eine Windows Universal Class Library oder eine Windows Universal Runtime Component.

Da Sie die App portierbar machen möchten, müssen Sie mit Dependency Injection einen anderen Ansatz wählen.

In der Portable Class Library sollte nur plattformunabhängiger Code verwendet werden . Da Speech APIs definitiv nicht plattformunabhängig sind (jedes Betriebssystem hat eine eigene Implementierung und jede Implementierung ist sehr unterschiedlich), müssen Sie nur eine Schnittstelle in Ihrem PCL haben und dann die Implementierung in Ihren Plattformprojekten bereitstellen .

Wie wird es funktionieren?

Sagen wir der Einfachheit halber, dass Sie nur die Sprachsynthese verwenden wollen (für die Spracherkennung wäre die Lösung analog).

Zuerst würden Sie eine ISpeechSynthesisService -Schnittstelle in Ihrem PCL erstellen:

%Vor%

Nun würden Sie eine Implementierung in Ihrem UWP-Projekt bereitstellen:

%Vor%

Da Sie wahrscheinlich den Service in Ihrem PCL-Projekt (z. B. in einem ViewModel) verwenden möchten, profitieren Sie jetzt von einem Dependency Injection -Container. Die meisten MVVM-Frameworks bieten dies an der Box (Template 10, MvvmLight, MvvmCross, Prism, usw.) Der DI-Container ermöglicht es Ihnen, Implementierungen für eine bestimmte Schnittstelle zu registrieren und ihre Instanzen zu erstellen. Also in Ihrem UWP projizieren Sie etwas wie:

%Vor%

Und dann würden Sie entweder Instanz in der PCL direkt erhalten, zum Beispiel:

%Vor%

Oder Sie verwenden lieber Konstruktorinjektion für Ihre ViewModels oder andere Dienste:

%Vor%

Wie ich bereits erwähnt habe, werden Sie diese beiden Ansätze "kostenlos" mit den meisten MVVM-Frameworks erhalten. Sie müssen das also nicht manuell implementieren.

    
Martin Zikmund 08.09.2016, 07:37
quelle
0

Diese Fehler haben mich verrückt gemacht, weil die fehlerhafte Bibliothek von VS automatisch hinzugefügt wurde, ohne dass ich es merkte. Sobald ich das herausgefunden hatte, war die Auflösung einfach.

  1. Entfernen Sie die betreffende Referenz (in Ihrem Fall Windows.Foundation.UniversalApiContract , aber der Fehler kann auch für andere Bibliotheken auftreten, wie in meinem Fall Windows.Phone.PhoneContract ).
  2. Schließen Sie Visual Studio
  3. Löschen Sie den Ordner bin und obj aus Ihrem Projektverzeichnis
  4. Öffnen Sie das Projekt
  5. Führe einen Clean
  6. aus
  7. Suchen Sie nach einem Ersatz für die gerade entfernte Bibliothek (falls erforderlich)
  8. Rebuild und Sie sollten gefunden werden
GuyMontag 12.06.2017 09:35
quelle