UriFormatException:无效的URI:指定了无效的端口
作为一个Uri下面的一个参数的程序集限定string在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)); } }
那是因为你正在执行这个代码而pack://
scheme还没有被注册。 这个scheme是在创buildApplication
对象时注册的。 您可以在testing夹具的设置中添加以下代码:
[SetUp] public void Setup() { if (!UriParser.IsKnownScheme("pack")) new System.Windows.Application(); }
编辑:实际上它看起来pack://
scheme是在PackUriHelper
类的types初始值PackUriHelper
项中注册(恰好被Application
类使用)。 所以实际上你不需要创build一个Application
实例,你只需要访问一个PackUriHelper
的静态成员来确保types初始化器已经运行:
[SetUp] public void Setup() { string s = System.IO.Packaging.PackUriHelper.UriSchemePack; }
看起来,访问“PackUriHelper.UriSchemePack”只注册“pack”scheme,而不是我在unit testing中使用“pack:// application:,,, /”语法所需的“application”scheme。 因此,我不得不使用“新的应用程序()”的方法,这两个scheme登记工作正常。
如果您在Windows Store / WinRT项目中看到这个错误:
当我尝试在我的C#应用程序中加载资源时,我无法使用“pack://”语法。 有用的是ms-appx://这种语法:
ms-appx://[project folder]/[resource path]
例如,我想从文件夹“core”加载名为“styles.xaml”的资源字典。 这个URI最终为我工作:
dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml");
即使问题指定WPF,问题看起来非常相似,但最终有一个完全不同的解决scheme,这需要一段时间才能find,现有的答案根本没有帮助。
同样,这个解决scheme不适用于WPF