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