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