.NET 어셈블리에 텍스트 파일을 포함하는 방법은 무엇입니까?


118

디스크에서 읽을 필요없이 텍스트를로드 할 수 있도록 어셈블리에 텍스트 파일을 포함하고 필요한 모든 항목이 exe에 포함되도록하고 싶습니다. (더 휴대 가능하도록)

이를 수행하는 방법이 있습니까? 리소스 파일에 대해 뭔가 가정합니까?

그리고 가능하다면 어떻게하고 텍스트를 어떻게 프로그래밍 방식으로 문자열에로드합니까?

답변:


147

프로젝트 파일을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

열리는 창에서 리소스 탭으로 이동하고 탭 페이지 중간에 파란색 링크 만있는 경우 클릭하여 새 리소스를 만듭니다.

여기에 이미지 설명 입력

그런 다음 탭 페이지 위의 도구 모음에서 새 텍스트 파일 추가를 선택하고 이름을 지정하면 프로젝트에 추가되고 열립니다.

이 정도면 코드에 Resources.TheNameYouGaveTheTextFileHere를 입력하면 해당 내용에 액세스 할 수 있습니다. 클래스에서 Resources 클래스를 처음 사용하는 경우 using 지시문을 추가해야합니다 (Resources를 입력 한 후 Ctrl +. 키를 눌러 VS가 해당 작업을 수행하도록 메뉴를 가져옴).

위의 설명이 명확하지 않은 경우 댓글을 남겨 주시면 완성되거나 이해가 될 때까지 수정하겠습니다. :)


1
'사용'지시어 코드는 어떻게 생겼을까 요?이 작업을 수행하기 위해 고군분투하고 있습니다. solutions.txt를 리소스로 추가했지만 Resources.solutions를 찾을 수 없습니다. using 지시문이 누락 된 것 같습니다.
Spedge 2009-06-13

3
아-하, 내가해야 할 일은 My. 전면 (예 : My.Resources.solutions) Simples!
Spedge 2009-06-13

2
리소스를 추가하면와 Properties\Resources.Designer.cs함께 생성되고 포함되므로을 namespace YourProjectRootNamespace.Properties사용해야 YourProjectRootNamespace.Properties합니다. ProjectRootNamespaceVisualStudio의 프로젝트 속성에 정의되어 있습니다.
ilyaigpetrov

1
이런 방식으로 텍스트 파일을 추가하고 텍스트 파일이 내 솔루션의 일부라고 말하면 파일이 업데이트되고 어셈블리를 다시 빌드하면 포함 된 리소스도 업데이트됩니까? 아니면 파일을 변경할 경우 수동으로 제거 / 다시 추가해야합니까?
Peter Tirrell

3
파일은 추가 할 때가 아니라 컴파일 타임에 리소스로 패키징됩니다. 원하는 도구로 파일을 자유롭게 변경하고 다시 작성할 수 있으며 변경 사항은 어셈블리의 일부가됩니다.
Lasse V. Karlsen 2015

38

Visual Studio 2003, Visual Studio 2005 및 이전 버전 (2008에서도 작동)에서는 프로젝트에 텍스트 파일을 포함시킨 다음 '속성'패널에서 작업을 '포함 된 리소스'로 설정할 수 있습니다. 그런 다음을 사용하여 파일에 스트림으로 액세스 할 수 있습니다 Assembly.GetManifestResourceStream(string).

여기에 다른 답변이 더 편리합니다. 완전성을 위해 이것을 포함합니다.

이 접근 방식은 이미지, 아이콘, 사운드 등과 같은 다른 유형의 파일을 포함하는 데 효과적입니다.


8
참고 : 이름 공간 + 파일 이름을 GetManifestResourceStream ()의 매개 변수로 사용하십시오 (예 : "MyNamespace.MyTextfile.txt"). GetManifestResourceNames ()를 호출하여 모든 이름 목록을 가져올 수도 있습니다.
Stiefel 2010-08-25

32

텍스트 파일을 삽입 한 후 다음과 같은 코드에서 해당 파일을 사용하십시오.

global::packageName.Properties.Resources.ThatFileName

3
리소스가 제거되면 컴파일러 오류가 발생하므로 훨씬 더 나은 접근 방식입니다. 또한 오타를 제거합니다. 게시물 주셔서 감사합니다.
벤 Gripka

+5. C # DLL 수준의 파일에 다시 쓸 수 있습니까?
Prajwal Bhat 2017

1
ThatFileName변수에서 지정하려면 어떻게해야 합니까?
c00000fd

4

예, 맞습니다. 리소스 파일을 만드세요. 문자열을 "로드"할 필요가없는 경우 Resource.WhateverStringYouDefined로 참조됩니다.


2

여기에 저에게 효과적이었습니다. (실행 가능한 .NET 이미지 파일에 포함 된 파일의 내용을 읽어야했습니다.)

작업을 수행하기 전에 Visual Studio의 솔루션에 파일을 포함합니다. (제 경우는 VS 2017 커뮤니티입니다.)으로 전환 Solution Explorer한 다음 Properties폴더 를 마우스 오른쪽 버튼으로 클릭 Add Existing Item하고 파일을 선택 하고 선택했습니다. (예를 들어, FileName.txt.) 그리고 여전히있는 동안 Solution Explorer, 포함 된 파일을 마우스 오른쪽 단추로 클릭 선택 Properties하고 선택 Build Action으로 Embedded Resource.

그런 다음이 코드를 사용하여 바이트를 읽습니다.

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

이 경우 수락 된 답변 에서 제안 된대로 해당 파일을 리소스로 추가 할 필요 가 없습니다 .


1

내가 한 일은 다음과 같습니다.

  1. 프로젝트를 마우스 오른쪽 단추로 클릭하여 Visual Studio에 내 파일 (리소스)을 추가했습니다.
  2. 추가 한 모든 파일을 마우스 오른쪽 버튼으로 클릭하고 "Build Type"을 Embedded Resource로 변경합니다.
  3. 리소스에 액세스하려면 :

    ㅏ. 함수를 사용하여 현재 어셈블리를 얻었습니다.GetExecutingAssembly()

    비. 추가 한 리소스는 텍스트 파일이므로 다음을 사용하여 스트림으로 읽었습니다.GetManifestResourceStream(fileName) . 파일 이름에 액세스하는 방법은 다음을 호출하는 것입니다.GetManifestResourceNames()

    씨. 이제 원하는 경우 StreamReader()클래스를 사용하여 파일 끝까지 변수로 읽어보십시오.


0

Pavan의 대답에 추가 하여 현재 어셈블리를 가져옵니다 (일반 섹션).

Assembly _assembly;

GetManifestResourceStream (fileName) (리소스에서 읽기가 필요한 코드) :

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.