2017-09-25 18 views
0

내 기본 Windows Forms (관리되는 C++) 프로젝트에는 반응 형 다이어그램을 만들기 위해 표시하거나 숨길 수있는 타일로 이미지를 표시하는 클래스가 있습니다. 외부에서 작성된 .resx 파일의 리소스에 액세스

:

나는 내가 모든 이미지는이 응용 프로그램은 C#으로 작성되는 등, 올바른 위치에 얻을 수 있습니다 다음과 같은 코드를 사용하여 이미지 데이터 및 위치를 포함하여 .resx 파일을 기록 별도의 유틸리티 응용 프로그램을 만들어
using(ResXResourceWriter resx = new ResXResourceWriter(sfd.FileName)) { 
    resx.AddResource("Size", canvas.Size); 
    List<int> IDs = canvas.IDs; 
    resx.AddResource("IDList", IDs); 
    resx.AddResource("BackgroundIndex", canvas.BackgroundIndex); 
    foreach(int id in IDs) { 
     String positionKey = String.Format("Position.id{0}", id); 
     String visibilityKey = String.Format("Visibility.id{0}", id); 
     String imageKey = String.Format("Image.id{0}", id); 
     resx.AddResource(imageKey, canvas.TileImage(id)); 
     resx.AddResource(positionKey, canvas.TilePosition(id)); 
     resx.AddResource(visibilityKey, canvas.TileVisible(id)); 
    } 
} 

텍스트 편집기에서 .resx 파일을 열어 올바른 형식이며 예상되는 데이터가 포함되어 있는지 확인할 수 있습니다.

그런 다음 .resx 파일을 기본 응용 프로그램의 프로젝트에 추가합니다. 이제는 내부 자원을 확보하는 방법을 알 수 없습니다. 내가 해봤 코드는 다음과 같습니다

리소스로드 실패 : 런타임시

ResourceManager^image_rm = gcnew ResourceManager(
    "resx_file_name_without_extension", GetType()->Assembly); 
ResourceSet^image_rs = image_rm->GetResourceSet(
    System::Globalization::CultureInfo::CurrentCulture, true, true); 

가, 두 번째 줄합니다 (GetResourceSet 호출) 다음과 같은 메시지 텍스트가있는 System.Resources.MissingManifestResourceException을 던졌습니다 을 찾을 수 없습니다 지정된 문화권 또는 중립 문화에 적합한 자원. 컴파일시 "resx_file_name_without_extension.resources"가 임베디드 또는 "my_assembly"어셈블리에 올바르게 연결되었는지 확인하거나 필요한 모든 위성 어셈블리를로드하고 완전히 서명했는지 확인하십시오.

나는 내 문제가 의심 스럽다 ... 잘 모르겠다. 어쩌면 ResourceManager 생성자에서 올바른 식별자를 사용하지 않는 것일 수 있습니다. 명시 적으로 "Build from Excluded From Build : No"및 "Content : Yes"을 파일 속성에 설정했지만 아무 효과가 없습니다.

외부에서 생성 된 .resx 파일을 프로젝트로 가져 와서 리소스 내에서 가져올 수 있습니까? 나는 그것을 컴파일 할 필요가있다. 매달린 .resx 파일이있는 제품을 배송 할 수 없습니다. 항상 .cpp 파일에 정적 데이터 객체 집합을 만들 수 있지만 .resx 접근 방식은 더 우아한 것처럼 보입니다.

답변

0

비밀 번호는 this unanswered question에 달려 있습니다. 식별자에 루트 네임 스페이스를 붙이는 것은 ResourceManager 행복을했다 :

ResourceManager^image_rm = gcnew ResourceManager(
    "my_root_namespace.resx_file_name_without_extension", GetType()->Assembly); 
ResourceSet^image_rs = image_rm->GetResourceSet(
    System::Globalization::CultureInfo::CurrentCulture, true, true); 

얼마나 나 컴파일러는 해당 네임 스페이스 나에게 신비의 약간은 여전히 ​​내 자원을 배치하기로 결정했습니다,하지만 그건 다른 날에 대한 퀴즈 이유.

내가 링크하는 질문은 프로젝트 내에서 VS로 만든 .resx와 관련이 있으며, 외부에서 생성 된 .resx를 추가하는 작업이 포함되므로 별도의 Q/A를 보증 할 수있는 충분한 상황이 아닌 것 같습니다.