UriFormatException: недопустимый URI: неверный порт указан

Строка, соответствующая сборке, используемая в качестве параметра ниже для работы Uri в 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)

UPDATE

Основываясь на превосходном ответе Томаса и моих собственных комментариях относительно удобочитаемости, я закончил использование следующего в моем классе 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));
        }
    }

Ответ 1

Это потому, что вы выполняете этот код, а схема pack:// еще не зарегистрирована. Эта схема регистрируется при создании объекта Application. Вы можете добавить этот код в настройку вашего тестового прибора:

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

EDIT: на самом деле кажется, что схема pack:// зарегистрирована в инициализаторе типа класса PackUriHelper (который используется классом Application). Таким образом, вам не нужно создавать экземпляр Application, вам нужно получить доступ к статическому элементу PackUriHelper, чтобы убедиться, что инициализатор типа запущен:

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

Ответ 2

Похоже, что доступ к PackUriHelper.UriSchemePack регистрирует только схему pack, не схему application, в которой мне нужно использовать синтаксис pack://application:,,,/ в моих модульных тестах. Поэтому мне пришлось использовать подход new Application(), который отлично работал для регистрации обеих схем.

Ответ 3

Если вы видите эту ошибку в проекте Windows Store/WinRT:

Я не смог использовать синтаксис "pack://" вообще при попытке загрузить ресурс в моем приложении С#. То, что сработало, было синтаксисом ms-appx://такого типа:

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

Например, я хотел загрузить словарь ресурсов с именем "styles.xaml" из папки "core". Этот URI работал у меня:

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

Несмотря на то, что вопрос задан WPF, проблема казалась очень похожей, но в итоге получилось совершенно другое решение, которое потребовалось некоторое время, чтобы найти, а существующие ответы вообще не помогли.

Опять же, это решение не относится к WPF