web-dev-qa-db-fra.com

UriFormatException: URI non valide: port spécifié non valide

La chaîne qualifiée d'assembly utilisée comme paramètre ci-dessous pour un Uri fonctionne en XAML, mais me donne l'erreur affichée lorsqu'elle est utilisée dans le code.

J'ai essayé tous les types d'UriKind avec le même résultat. Comment puis-je réparer cela?

[Test]
public void LargeImageSource_IsKnown()
{
var uri = new Uri(
        "pack://application:,,,/" + 
        "MyAssembly.Core.Presentation.Wpf;component/" + 
        "Images/Delete.png", UriKind.RelativeOrAbsolute);

Assert.That(
        _pickerActivityCollectionVm.DeleteActivityCommand.LargeImageSource,
        Is.EqualTo(uri));
}

System.UriFormatException : Invalid URI: Invalid port specified.
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri..ctor(String uriString, UriKind uriKind)

MISE À JOUR

Sur la base de la superbe réponse de Thomas et de mes propres commentaires sur la lisibilité, j'ai fini par utiliser ce qui suit dans ma classe BaseTestFixture. J'espère que ceci aide quelqu'un d'autre.

    protected virtual void OnFixtureSetUp() {
        // logging, other one time setup stuff...

        const string scheme = "pack";
        if (!UriParser.IsKnownScheme(scheme)) {
            Assert.That(PackUriHelper.UriSchemePack, Is.EqualTo(scheme));
        }
    }
55
Berryl

C'est parce que vous exécutez ce code pendant que le pack:// le schéma n'est pas encore enregistré. Ce schéma est enregistré lorsque vous créez l'objet Application. Vous pouvez ajouter ce code dans la configuration de votre appareil de test:

[SetUp]
public void Setup()
{
    if (!UriParser.IsKnownScheme("pack"))
        new System.Windows.Application();
}

EDIT: en fait, il semble que le pack:// Le schéma est enregistré dans l'initialiseur de type de la classe PackUriHelper (qui est utilisé par la classe Application). Donc, en fait, vous n'avez pas besoin de créer une instance de Application, vous avez seulement besoin d'accéder à un membre statique de PackUriHelper pour vous assurer que l'initialiseur de type s'est exécuté:

[SetUp]
public void Setup()
{
    string s = System.IO.Packaging.PackUriHelper.UriSchemePack;
}
81
Thomas Levesque

Il semble que l'accès à PackUriHelper.UriSchemePack Enregistre uniquement le schéma pack, pas le schéma application, dont j'avais besoin pour utiliser le pack://application:,,,/ syntaxe dans mes tests unitaires. J'ai donc dû utiliser l'approche new Application(), qui a bien fonctionné pour enregistrer les deux schémas.

9
Mathieu Frenette

Si vous voyez cette erreur dans un projet Windows Store/WinRT:

Je n'ai pas du tout pu utiliser la syntaxe "pack: //" lorsque j'ai essayé de charger une ressource dans mon application C #. Ce qui a fonctionné était la syntaxe ms-appx: // de ce type:

ms-appx://[project folder]/[resource path]

Par exemple, je voulais charger un dictionnaire de ressources nommé "styles.xaml" à partir d'un dossier "core". Cet URI a fini par travailler pour moi:

dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml");

Même si la question spécifiait WPF, le problème semblait extrêmement similaire mais a fini par avoir une solution complètement différente, ce qui a pris du temps à trouver, et les réponses existantes n'ont pas aidé du tout.

Encore une fois, cette solution ne s'applique pas à WPF

7
Daniel S.