UriFormatException:无效的URI:指定的端口无效

Ber*_*ryl 57 wpf resources xaml 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)
Run Code Online (Sandbox Code Playgroud)

UPDATE

基于Thomas的精湛答案以及我对可读性的评论,我在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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 84

那是因为您在该pack://方案尚未注册时执行此代码.创建Application对象时会注册此方案.您可以在测试夹具的设置中添加此代码:

[SetUp]
public void Setup()
{
    if (!UriParser.IsKnownScheme("pack"))
        new System.Windows.Application();
}
Run Code Online (Sandbox Code Playgroud)

编辑:实际上似乎该pack://方案是在类的类型初始值设定项中注册的PackUriHelper(恰好由Application类使用).所以实际上你不需要创建一个实例Application,你只需要访问一个静态成员 PackUriHelper来确保类型初始化程序已经运行:

[SetUp]
public void Setup()
{
    string s = System.IO.Packaging.PackUriHelper.UriSchemePack;
}
Run Code Online (Sandbox Code Playgroud)

  • +1第一个代码示例为我工作,但第二个代码示例没有.通过这样做,我能够稍微改进第一个样本:var current = Application.Current; 访问Application类就足以触发Application静态构造函数,它构建了我需要的所有Uri东西.... (4认同)
  • @ThomasLevesque,就我而言,我需要“应用程序”方案,该方案仅在应用程序静态构造函数执行时才出现初始化...... (2认同)

Mat*_*tte 10

看来,访问PackUriHelper.UriSchemePack只有注册pack方案,不是application方案,我需要使用pack://application:,,,/语法在我的单元测试.因此,我不得不使用这种new Application()方法,这种方法适用于注册这两种方案.

  • 或者,仅引用 Application 类将运行静态构造函数来初始化您所需的内容。只需使用这个:var current = Application.Current; (2认同)

Dan*_* S. 7

如果您在Windows应用商店/ WinRT项目中看到此错误:

在尝试在我的C#应用​​程序中加载资源时,我根本无法使用"pack://"语法.有效的是ms-appx://这种语法:

ms-appx://[project folder]/[resource path]
Run Code Online (Sandbox Code Playgroud)

例如,我想从文件夹"core"加载名为"styles.xaml"的资源字典.这个URI最终为我工作:

dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml");
Run Code Online (Sandbox Code Playgroud)

即使问题指定了WPF,问题似乎非常相似,但最终得到了一个完全不同的解决方案,需要一段时间才能找到,现有的答案根本没有帮助.

同样,此解决方案不适用于WPF