[c#] GetManifestResourceStream이 NULL을 반환합니다.

이것은 C # .NET 4.0 응용 프로그램입니다.

텍스트 파일을 리소스로 포함하고 대화 상자에 표시하려고합니다.

    var assembly = Assembly.GetExecutingAssembly();
    var resourceName = "MyProj.Help.txt";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                string result = reader.ReadToEnd();
                System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
            }
        }

솔루션은 MyProjSolution이고 실행 파일은 MyProj.exe입니다. Help.txt는 포함 된 리소스입니다. 그러나 스트림은 null입니다. MyProjSolution.Help.txt 및 MyProjSolution.MyProj.Help.txt를 시도했지만 아무것도 작동하지 않는 것 같습니다.



답변

다음을 사용하여 리소스가 올바르게 포함되었는지 확인할 수 있습니다.

//From the assembly where this code lives!
this.GetType().Assembly.GetManifestResourceNames()

//or from the entry point to the application - there is a difference!
Assembly.GetExecutingAssembly().GetManifestResourceNames()

디버깅 할 때. 그러면 코드가 작성된 어셈블리에 포함 된 모든 리소스의 모든 (정규화 된 이름)이 나열됩니다.

MSDN에서 Assembly.GetManifestResourceNames () 를 참조하십시오 .

관련 이름을 복사하고 ‘resourceName’변수에 정의한 이름 대신 사용하십시오.

참고-리소스 이름은 대소 문자를 구분하며 리소스 파일을 잘못 삽입 한 경우 GetManifestResourceNames () 호출에서 반환 된 목록에 표시되지 않습니다. 또한-올바른 어셈블리에서 리소스를 읽고 있는지 확인하십시오 (여러 어셈블리가 사용되는 경우). 참조 된 어셈블리가 아닌 현재 실행중인 어셈블리에서 리소스를 얻는 것이 너무 쉽습니다.

편집-.NET Core .NET Core를 사용하여 포함하는 방법에 대한 자세한 내용
은이 SO 게시물 을 참조하십시오.

매니페스트 정보 검색은 비슷해 보입니다 this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames(). 코드가 실행중인 어셈블리에서 매니페스트를 가져 오는 데 사용 하면됩니다.

Assembly.GetExecutingAssembly()아직 .NET Core에서 해당 작업을 수행하는 방법을 찾지 못했습니다! 아는 사람이 있으면 알려주세요.이 답변을 업데이트하겠습니다.


답변

먼저 파일이 프로젝트에 포함되어 있는지 비슷한 문제를 확인한 다음 속성으로 이동하여 해당 파일의 빌드 작업을 Embedded Resource로 설정했습니다. 이것은 나를 위해 일했습니다.


답변

포함 된 파일의 “Build Action” 속성을 “Embedded Resource” 로 설정하여 아래에 제공된 줄을 올바르게 실행해야합니다.

Stream stream = assembly.GetManifestResourceStream(resourceName)

파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭 한 다음 “Build Action”속성을 “Embedded Resource”로 설정합니다.

여기에 이미지 설명 입력


답변

내 null 값의 원인은 다음과 같습니다.

http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/

GetManifestResourceStream메서드는 NULL리소스 ‘built action’속성이 ’embedded resource’로 설정되지 않은 경우 항상 반환 합니다.

모든 필요한 파일이 속성을 설정 한 후 assembly.GetManifestResourceStream대신 올바른 스트림을 반환 시작합니다 NULL.


답변

경고 일뿐입니다.

파일이 포함 된 리소스로 지정했지만 해당 빌드 작업 속성이 있어도 파일에 액세스 할 수 없습니다. 머리를 두드리는 데 많은 시간을 낭비했습니다. 이름에 .txt가 추가 된 csharp 코드 파일 (xxx.cs.txt)을 삽입했습니다. 어떤 이유로 GetManifestResourceNames () 및 GetManifestResourceStream () 메서드는 이름에 .cs가 포함 된 파일을 볼 수 없습니다.

나는 그것을 단순히 xxx.txt로 이름을 바꾸었고 모든 것이 잘되었습니다.

기묘한.


답변

Jay 덕분에 디렉토리 이름에 하이픈이 있다는 것을 알았습니다.

ProjectName.ResourceFolder.Sub-Directory된다 ProjectName.ResourceFolder.Sub_Directory당신이 자원 스트림을 참조 할 때.


답변

제 경우 문제는 리소스를 찾는 코드가 리소스 자체와 다른 프로젝트에 있다는 것입니다.

코드와 동일한 프로젝트에있는 리소스에만 액세스 할 수 있습니다. 웹 페이지 프로젝트에 모든 리소스를 넣을 수 있다고 생각했지만 메일 프로젝트에도 이미지가 필요합니다.

이것이 나와 같은 상황에있는 누군가에게 도움이되기를 바랍니다.

나는 정말 유용한 전화를 찾습니다 Assembly.GetExecutingAssembly().GetManifestResourceNames();.