2011-05-14 33 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 클래스에서 다음을 사용하여 상처. 희망이 다른 사람을 도와줍니다. pack:// 계획이 아직 등록되지 않은 상태에서이 코드를 실행하고 있기 때문이다

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

적용되지 않는 참고 참고 : 나는 기본 프로세스에 호스팅되는 WPF 창을 사용하여 동일한 문제에 직면하고있다. –

답변

68

. 이 구성표는 Application 개체를 만들 때 등록됩니다.

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

편집 : 당신은 당신의 테스트 픽스처의 설정에서이 코드를 추가 할 수 있습니다 실제로는 pack:// 계획에 의해 사용 일어나는 PackUriHelper 클래스의 형식 이니셜 (에 등록되어 보인다 Application 클래스).

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

달콤한 - 고마워요 토마스 – Berryl

+1

첫 번째 버전의 가독성을 좋아했지만 훨씬 좋았습니다. 나는 's'에서 'ensurePackSchemeIsKnown'으로 문자열을 변경했기 때문에 왜 내가 지금 1 주일 전부터 이렇게했는지 기억할 기회가 있습니다. 건배 – Berryl

+3

+1 첫 번째 코드 샘플은 저에게 효과적 이었지만 두 번째 코드 샘플은 저에게 효과적이었습니다.나는 이것을 수행함으로써 첫 번째 샘플을 약간 향상시킬 수 있었다 : var current = Application.Current; Application 클래스에 액세스하면 필요한 모든 Uri 항목을 설정하는 응용 프로그램 정적 생성자를 트리거 할만큼 충분합니다. –

9

그것은 PackUriHelper.UriSchemePack에 액세스하는 경우에만 pack를 등록 나타납니다 : 그래서 실제로 당신은 당신은 단지 실행 한 형식 이니셜을 보장하기 위해 PackUriHelper의 정적 멤버에 액세스 할 필요가 Application의 인스턴스를 만들 필요가 없습니다 scheme application 구성표. 내 단위 테스트에서 pack://application:,,,/ 구문을 사용해야했습니다. 그러므로 나는 new Application() 접근 방식을 사용해야했습니다. 두 접근 방식을 모두 등록하는 데는 문제가 없었습니다. 당신은 윈도우 스토어/WinRT 프로젝트에서이 오류가 표시되는 경우

+0

Application 클래스를 참조하는 것만으로 필요한 것을 초기화하는 정적 생성자가 실행됩니다. 그냥 사용하십시오 : var current = Application.Current; –

7

는 :

본인은 "팩 : //"를 사용 할 수 없습니다에 리소스를로드 할 때 모든 구문을 내 C# 응용 프로그램. 어떤 일을하는 것은 MS-appx :이 종류의 // 구문 :

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

예를 들어, 내가 폴더 "핵심"에서 "styles.xaml"라는 이름의 리소스 사전을로드하고 싶었다. 이 URI는 나를 위해 일하는 결국 : 문제는 WPF를 지정하더라도

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

이 문제가 매우 유사한 듯하지만, 찾는 동안을 잡았다 완전히 다른 솔루션을 가지고 결국, 기존의 답변이 도움이되지 않았다 조금도.

다시 말하지만,이 솔루션으로 WPF

관련 문제