57 votes

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

La chaîne qualifiée d'assemblée utilisée comme paramètre ci-dessous pour un Uri fonctionne dans XAML, mais me donne l'erreur indiqué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ésoudre ce problème ?

[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)

UPDATE

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 cela aidera 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));
        }
    }

84voto

Thomas Levesque Points 141081

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

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

EDIT : en fait, il semble que le pack:// est enregistré dans l'initialisateur de type de l'objet PackUriHelper (qui se trouve être utilisée par la classe Application ). Donc, en fait, vous n'avez pas besoin de créer une instance de Application vous n'avez besoin d'accéder qu'à un membre statique de l'application PackUriHelper pour s'assurer que l'initialisateur de type a été exécuté :

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

10voto

Mathieu Frenette Points 160

Il semble que l'accès PackUriHelper.UriSchemePack enregistre uniquement le pack schéma, pas le site application dont j'avais besoin pour utiliser le pack://application:,,,/ dans mes tests unitaires. J'ai donc dû utiliser le new Application() qui a bien fonctionné pour l'enregistrement des deux systèmes.

7voto

Daniel S. Points 1422

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 fonctionnait, c'é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 fonctionner 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 avait finalement une solution complètement différente, qui a pris un certain temps à trouver, et les réponses existantes n'ont pas du tout aidé.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X