UriFormatException: неверный URI: указан неверный порт - PullRequest
54 голосов
/ 15 мая 2011

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

Ответы [ 3 ]

80 голосов
/ 15 мая 2011

Это потому, что вы выполняете этот код, пока схема 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;
}
9 голосов
/ 14 декабря 2011

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

7 голосов
/ 05 октября 2013

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

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

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

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

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

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

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

...