web-dev-qa-db-ja.com

UriFormatException:無効なURI:無効なポートが指定されました

Uriの以下のパラメーターとして使用されるAssembly修飾文字列はXAMLで機能しますが、コードで使用すると表示されるエラーが発生します。

あらゆる種類のUriKindを試してみましたが、同じ結果になりました。どうすれば修正できますか?

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

更新

トーマスの素晴らしい答えと読みやすさについての私自身のコメントに基づいて、私はBaseTestFixtureクラスで以下を使用しました。これが他の誰かに役立つことを願っています。

    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

これは、pack://スキームはまだ登録されていません。このスキームは、Applicationオブジェクトを作成するときに登録されます。次のコードをテストフィクスチャのセットアップに追加できます。

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

編集:実際にはpack://スキームは、PackUriHelperクラスの型初期化子に登録されます(たまたまApplicationクラスで使用されます)。したがって、実際にはApplicationのインスタンスを作成する必要はありません。型初期化子が実行されていることを確認するには、PackUriHelperの静的メンバーにアクセスするだけです。

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

PackUriHelper.UriSchemePackにアクセスすると、packスキーム、notapplicationスキームのみが登録され、ユニットテストでpack://application:,,,/構文を使用する必要がありました。したがって、new Application()アプローチを使用する必要がありました。これは、両方のスキームを登録するのにうまくいきました。

9

Windowsストア/ WinRTプロジェクトでこのエラーが表示される場合:

C#アプリでリソースをロードしようとしたときに、「pack://」構文を使用できませんでした。うまくいったのは、この種のms-appx://構文です。

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

たとえば、フォルダ「core」から「styles.xaml」という名前のリソースディクショナリをロードしたかった。このURIは私のために働いてしまいました:

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

質問はWPFを指定していましたが、問題は非常に似ているように見えましたが、最終的にはまったく異なる解決策があり、見つけるのに時間がかかり、既存の回答はまったく役に立ちませんでした。

繰り返しますが、このソリューションはWPFには適用されません

7
Daniel S.