2011-05-14 101 views
47

用作Uri的參數的程序集限定字符串在XAML中工作,但給我在代碼中使用時顯示的錯誤。UriFormatException:無效的URI:指定的端口無效

我試過每種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

作爲FYI注意:我現在面臨使用託管到本機進程WPF窗口同樣的問題。 – 2012-09-10 10:59:21

回答

68

這是因爲您正在執行此代碼,而pack://方案尚未註冊。此方案是在創建Application對象時註冊的。

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

編輯:您可以在測試夾具的設置添加這段代碼實際上似乎pack://方案登記在PackUriHelper類的類型初始化(恰好被使用類別Application)。所以,其實你並不需要創建的Application一個實例,你只需要訪問的PackUriHelper靜態成員,以保證類型初始化已運行:

[SetUp] 
public void Setup() 
{ 
    string s = System.IO.Packaging.PackUriHelper.UriSchemePack; 
} 
+0

甜 - 謝謝托馬斯 – Berryl 2011-05-15 00:17:18

+1

更好,雖然我喜歡第一版的可讀性。我將字符串從's'更改爲'ensurePackSchemeIsKnown',所以我有機會記住爲什麼我從現在開始的一週左右做了這個。乾杯 – Berryl 2011-05-15 04:18:17

+3

+1第一個代碼示例適用於我,但第二個代碼示例沒有。我可以通過這樣做來改進第一個示例:var current = Application.Current;訪問應用程序類足以觸發應用程序靜態構造函數,該構造函數設置了我需要的所有Uri內容.... – 2012-04-04 19:44:22

9

似乎訪問PackUriHelper.UriSchemePack只註冊了pack方案,不是application方案,我需要在我的單元測試中使用pack://application:,,,/語法。因此,我不得不使用new Application()方法,這對於註冊這兩種方案都很有效。

+0

或者,只引用應用程序類將運行靜態構造函數,以初始化您所需的內容。只需使用這個:var current = Application.Current; – 2012-04-04 19:47:01

7

如果你看到在Windows應用商店/ WinRT的項目這個錯誤:

我不能使用「包://」試圖加載資源時的語法我所有的C#應用程序。什麼工作是MS-APPX://語法這樣的:

ms-appx://[project folder]/[resource path] 

例如,我想加載一個名爲「styles.xaml」從文件夾中的「核心」資源字典。這種URI結束了對我的工作:

dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml"); 

這些問題即使指定WPF,問題似乎非常相似,但最終有一個完全不同的解決方案,它花了一段時間去發現,現有的答案沒有幫助在所有。

此外,該解決方案並不適用於WPF