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