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)

обновление

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

3 ответа:

это потому, что вы выполняете этот код в то время как 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;
}

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

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

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

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

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

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

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

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