2013-12-11 2 views
6

여기서는 매우 간단한 내용이 누락되었지만 리플렉션을 사용하여이 포함 된 동일한 어셈블리 에서 포함 된 리소스를 검색 할 때의 이점은 무엇입니까? .resx 파일을 통해 간단히 검색 할 수 있습니까? 나는 이것을 많이 보지만 그것을 얻지는 않습니다 - 을 resx 파일 Resources.resource과 비교할 이유가 있습니까? 심지어 마이크로 소프트는 그것을한다 : How to embed and access resources.포함 된 리소스에 액세스하기위한 리소스 파일 (.resx) 대 리플렉션

정확하게 말하자면, 임베디드 리소스 Config.xml이 포함 된 어셈블리 MyAssembly이 있다고 가정 해보십시오.

public string GetConfigXML() 
{ 
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream); 
    return xml; 
} 

GetManifestResourceStream() 때를 사용

public string GetConfigXML() // returns the content of Config.xml as a string 

가 종종 내가 리소스를 검색하는 반사를 사용하여,이 같은 구현을 참조하십시오 어셈블리는 문자열로 말했다 리소스를 반환하는 방법을 구현 MyClass있다 당신은 할 수 있습니다

  1. 비주얼 스튜디오에서 MyAssembly 프로젝트에 리소스 파일 (Resource.resx)을 추가;
  2. Config.xml을 자원의 'Files'에 추가하십시오. string xml = Resource.Config;

내가 내부적으로 .resx 파일을 처리하는 방법을 비주얼 스튜디오 모르겠지만,에 (그것을 단순히 복사 된 .resx 파일에 리소스를 의심 :

  • 훨씬 간단한 방법으로 Config.xml의 콘텐츠를 어떤 경우에는 중복 된 리소스로 끝날 것입니다). 내부적으로 리플렉션을 사용하지 않는다고 가정합니다. 이와 같은 상황에서 단순히 .resx 파일을 사용하지 않는 것이 어떻습니까? 내 성능이 훨씬 좋아 보이는 이유는 무엇입니까?

  • +1

    어셈블리를 통해 가져 오는 것은 culture 인식 위성 어셈블리를로드 할 수 있지만 resx를로드하면 현재 문화권에 맞는 올바른 어셈블리를 선택해야합니다. –

    답변

    3

    하지만 포함 리소스

    에게 한 형식에서 다른 형식으로 데이터를 변환 할 이유 뒤에 공통 이익을 검색하는 반사를 사용하는 혜택을거야. 속도, 속도, 속도 및 편의성.

    XML은 리소스를 저장하는 데 꽤 알맞은 형식입니다. 원본이 시간의 안개 속에서 길을 잃었을 때부터 10 년 후에도 여전히 원본 리소스를 검색 할 수 있다는 매우 좋은 보장을 받게됩니다. 좋은 백업없이 기계가 변경됩니다. 그러나 XML을 읽는 것은 아주 짜증나는 형식입니다. XML은 매우 장황하고 조각을 찾으려면 파일의 시작 부분부터 읽어야합니다.

    Resgen.exe가 .xml 파일을 .resource 파일로 컴파일 할 때 사라지는 문제. 어셈블리 메타 데이터에 링크되고 리소스의 원래 바이트를 포함하는 바이너리 형식입니다. 그리고 어셈블리가로드 될 때 메모리에 직접 매핑되므로 다른 파일을 찾아서 열고 읽을 필요가없고 데이터를 변환 할 필요가 없습니다. 큰 차이.

    리소스 디자이너를 사용하여 GetManifestResourceStream()을 직접 사용하지 않아도됩니다. 그러나 더 많은 편의.

    +0

    공정한 점, 감사합니다.하지만 직접 리소스 액세스를 위해 리플렉션을 사용하면 속도가 향상된다는 사실은 .resx에 많은 양의 리소스 파일을 저장하는 경우에만 분명히 드러나지 만 적은 수의 임베디드 리소스에 대해서는 실제로 리플렉션이 가능할 것입니다. .resx에서 읽는 것과 비교해 더 느립니다 ('GetManifestResourceStream'을 필요로하고 적절한 형식으로 변환해야하기 때문에). – w128

    +4

    "반사가 느리다"라는 일반적인 신화에서 나오는 것처럼 보입니다. 속성 값을 얻기 위해 리플렉션을 사용하여 속성을 직접 비교하는 경우와 비교할 때만 느립니다. 물론 Reflection을 통해 나노 초를 이길 수는 없습니다. GetManifestResourceStream은 파일을 여는 것보다 느리지는 않습니다 *. 그것은 쉽게 50,000 배 더 빠르며, 크기를주고받습니다. :) –

    관련 문제