반응형

뻔하디 뻔한 개발 노하누는 가라~

이번에도 쓸만한 내용을 소개해 드릴 까 합니다.

개발을 하다 보면 실제 소스코드 외에도 어떤 텍스트를 resource 에 넣어 두고 소스코드에서 불러와야 하는 경우가 있을 수 있습니다. 저의 경우는 포토샵, 일러스트 등의 프로그램을 연동하여 c# 으로 App 을 만들었을때 실제 수행되는 코드는 jsx 스크립트 파일로 만든 뒤 app 에서 해당 스크립트를 실행하도록 하는데 이때 resource 에 스크립트 파일을 추가해 놓고 실행하는 타이밍에 해당 내용을 불러와 실행하도록 하는 경우가 종종 있습니다.

일단 c# 보다 javascript 로 작성하는게 쉽고 나중에 오류가 생기더라도 app 이 아닌 기능 단위로 만들어진 스크립트만 수정하면 되기 때문인데요.

보통 인터넷에 그런 내용으로 검색해 보면 실행파일이 빌드되는 순간 빌드 폴더에 해당 스크립트 파일이 복사되고 실행 파일 경로를 기준으로 하여 해당 파일을 불러와서 사용하도록 안내하고 있는 예제가 대부분입니다.

해당 스크립트(텍스트)를 굳이 공개하고 싶지 않고 스크립트 코드(텍스트 파일)가 빌드된 실행파일 내에 포함되면서 해당 텍스트를 불러오는 방법을 이번에 소개해 드리겠습니다.

두가지 방법이 있는데요. 두가지 방법을 모두 보시고 본인이 편한 방법을 사용하면 되겠습니다.

 

1. Properties > Resources.resx 내에 추가하는 방법

  1. 개발 디렉토리 내 임의의 폴더를 생성
  2. 생성된 임의의 폴더에 원하는 텍스트 파일 작성
  3. 작성된 텍스트 파일을 Properties > Resources 내에 텍스트 리소스로 추가
  4. 소스코드 내에 리소스를 텍스트(string) 로 가져오는 코드 작성

자 실제 화면을 보면서 설명을 드려보면요

JS 폴더를 생성한 뒤 텍스트 파일을 하나 추가함

위와같이 임의의 폴더를 하나 개발 디렉토리내에 생성한 뒤 필요한 텍스트 파일을 추가 합니다.

저의 경우는 포토샵 스크립트 파일 포멧인 jsx 로 추가하였고요. 좌측 내용을 보면 실행하면 그냥 "hello photoshop" 을 팝업으로 띄워주는 스크립트 입니다. 

그 다음 Properties > Resources.resx 를 더블클릭해서 열어준 뒤 좌측 상단의 리소스 타입을 '파일'로 변경해 줍니다.

리소스 타입을 파일로 변경\

 

그런 다음 리소스 추가 를 누르시고 '기존 파일 추가' 를 선택해 줍니다.

아까 만들어둔 파일을 등록한다

그럼 파일 선택 창이 나타나는데요. 아까 만들어준 JS 폴더 ( 본인이 생성한 폴더) 에 가보시면 생성한 텍스트 파일이 있을 거고요. 해당 파일을 선택해 주시면 됩니다.

01 은 바이너리 라는 뜻

그럼 이렇게 파일이 들어와 있는 것을 보실 수 있는데요. 이 파일이 텍스트 파일이라고 확인을 시켜 주어야 합니다.

우측 아래 속성 텝에 보면 이 파일의 타입이 Binary 로 되어 있는 것을 Text로 변경해 주어야 합니다.

바이너리로 되어 있다
텍스트로 변경

Text 로 변경하고 나면 위와 같이 인코딩을 지정할 수 있으니 나중에 텍스트 오류가 나면 해당 인코딩을 변경해가면서 사용하시면 됩니다.

자 이제 리소스로 추가 하였으니 불러오는 방법을 알아야 겠죠?

리소스로 등록한 텍스트 파일을 문자열로 불러오는 방법

위와 같이 string 문자열을 만들어서 불러오면 됩니다. PSXL_AUTO 는 솔루션 명으로 namespace 에 지정된 이름을 사용하시면 됩니다.

그 뒤로는 Properties 부터 자동완성 되므로 상세한 설명은 생략

MessageBox.Show(myResourceText) 를 이용하여 리소스 텍스트 내용을 불러와보면 

요렇게 잘 불러와 진것을 볼 수 있습니다.

물론 이렇게 하면 자동으로 포함리소스가 되므로 런타임에 별도로 파일을 찾아야 하거나 할 필요가 없습니다. 빌드 폴더에도 역시 별도로 파일이 나오거나 하지 않습니다.

간단하죠?

막상 해보면 간단합니다.

 

2. 그냥 개발 디렉토리 내에 폴더를 생성하고 파일을 추가하는 방법

 

  1. 임의의 폴더를 생성한다
  2. 생성한 폴더에 스크립트 파일을 작성한다
  3. 실행할 때 해당 스크립트를 불러오는 코드를 포함하여 실행한다.

 

요 방법도 제가 자주 사용하는 방법인데요. 별도로 리소스로 등록할 필요가 없어서 스크립트를 만들고 사용하는 과정에서 좀더 간단한 방법이라 할 수 있겠습니다.

물론 실행하는 부분에서 코드가 약간 복잡하기는 하지만 그래도 텍스트를 만들고 또 리소스에 추가하는 과정이 없어 좀더 직관적이라고 할까요? 

임의의 폴더에 스크립트 파일을 추가하였다

이번에도 생성한 폴더에 스크립트 파일을 추가하였습니다.

내용을 구분하기 위하여 hellow 를 bye로 변경하였습니다 ㅎ

속성 텝에서 아래와 같이 포함리소스, 출력디렉토리에 복사 안함 으로 설정해 줍니다.

포함리소스, 복사안함으로 설정 필수

 

자 이제 코드를 불러오는 내용을 작성해야 하는데요. resources 에 추가한 내용을 불러오는 것은 아주 간단했죠?

요건 약간 복잡합니다. 아래 코드를 참고해 주세요.

private string showtextString()
        {
            string myStr = "";
            var assembly = Assembly.GetExecutingAssembly();
            var myScript = "PSXL_Auto.JS.defPSScript.jsx";
            using (Stream stream = assembly.GetManifestResourceStream(myScript))
            {
                using (StreamReader sr = new StreamReader(stream))
                {
                    myStr = sr.ReadToEnd();
                }
            }
            MessageBox.Show(myStr);
            return myStr;
        }

// 또는 

private string showtextString(string txtName)
        {
            string myStr = "";
            var assembly = Assembly.GetExecutingAssembly();
            var myScript = "PSXL_Auto.JS." + txtName;
            using (Stream stream = assembly.GetManifestResourceStream(myScript))
            {
                using (StreamReader sr = new StreamReader(stream))
                {
                    myStr = sr.ReadToEnd();
                }
            }
            MessageBox.Show(myStr);
            return myStr;
        }
        
        
// 실행하는 부분에서
showtextString("defPSScript.jsx");

일단 간단하게 해당 리소스 텍스트를 string 으로 돌려주는 함수처럼 만들었는데요. 코드 내에 "JS" 라는 부분은 사용자가 만든 폴더 명칭이라는 것을 아실 수 있으시죠? 물론 아래와 같이 리소스 파일명을 인자로 받아 해당 텍스트를 리턴해 줄 수 있도록 하면 사용할 때도 간단하게 사용할 수 있을 것입니다.

요렇게 만들어진 함수를 실행해서 메시지 박스로 출력해 보면 

당연히 잘 출력 됩니다.

중간에 bye 로 나오는 것 잘 보이시죠?

당연히 위의 두가지 방법 모두 실행 파일 경로에 해당 텍스트 파일이 따라오지 않고 잘 숨겨져 있게 됩니다.

 

꼭 필요하신 분들께 도움이 되었기를 바라면서 이만 줄입니다~

 

2020.08.11 - [DEV/c#] - [c#] streamreader 를 이용하여 정확한 라인 위치 찾기

 

[c#] streamreader 를 이용하여 정확한 라인 위치 찾기

c# 을 이용하여 streamreader 개체로 텍스트를 읽는 방법은 매우 효율 적이고 손쉽게 작업을 수행하도록 해줍니다. 빠르고 간단하게 개발을 할 수 있어 저도 자주 사용하고는 합니다. 그런데 이번에

diy-dev-design.tistory.com

 

2020.06.03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가

diy-dev-design.tistory.com

 

2020.07.21 - [DEV/c#] - C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

 

C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

오늘 소개해드릴 꿀팁은요. 문자열을 읽어 들여서 문자열 내에 들어있는 특정 단어를 이용하여 개발 중인 코드의 변수로 인식하여 해당 변수에 값을 세팅하는 방법을 소개해 드릴까 합니다. 예

diy-dev-design.tistory.com

 

 

반응형

+ Recent posts