Microsoft MVP성태의 닷넷 이야기
글쓴 사람
이성환 (vactorman at naver.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

vs2010 에서 WPF 응용 프로그램으로 생성된 솔루션이 있습니다.

솔루션 내에 Output Type이 Windows Application인 프로젝트 A와 B가 있습니다.(프로젝트 타입은 WPF Application 입니다.)
이 중 A의 내용을 통째로 가져와 B가 실행 될 때 띄워야하는데요.
(실제로는 꽤나 복잡한 작업들이 중간에 들어가있습니다.)

그래서 B 프로젝트에서 A를 참조한 후 App.xaml.cs 에서 OnStartup메서드에서 A를 생성하고 Show()하도록 만들었습니다.

작업 후 빌드가 완료 되고
일단 B를 실행 시켰을 때
의도했던 대로 동작을 잘 합니다.

그런데 문제는 Class Library가 아닌 Application 을 참조하다보니
B의 빌드 생성 파일에 A의 실행 파일도 함께 생성된다는 점입니다.

이를 테면
A 제품을 만들고 A의 라이트 버전(혹은 기능 제한 버전)으로 B를 만든 경우

패키징을 위해 B 프로젝트를 단독으로 생성해야하는 상황입니다.

제품으로 내보내야할 라이트 버전에 본 버전이 함께 들어가는 상황인 셈이죠.

그래서 크게 고민한 건 두가지 방법입니다.

하나는, 위에서 언급한 A 프로젝트를 참조하는 방법입니다.
장점은 A의 소스가 그대로 B에 반영된다는 점과 작업량이 크지 않는 점입니다.
단점은 B 패키지에 A 실행 파일이 첨부된다는 문제 입니다.
또 B에 필요치 않은 기능이 추가될 경우 일일이 분기를 해야하는다는 부담도 있습니다.

두번째는, 아예 새롭게 B를 만드는 방법입니다.
장점은 A와 관계 없이 B를 조작할 수 있다는 점입니다. 의존성이 그나마 낮아질 수 있다고 봅니다.
단점은 A의 기능이나 버그 수정 시 B에도 추가 작업을 해줘야한다는 부담과 버전관리의 어려움입니다.
처음부터 라이트 버전을 염두에 두고 A를 만든 것이 아니라 구조적으로 매우 나쁜 방향이긴 합니다.
게다가 프로젝트의 덩어리가 크다보니 A의 소스를 적당히 B에 땡겨 쓸 수 있는 상황도 아닙니다.
결국 Copy&Paste를 해야하는 상황인데, 이것 역시 만만치 않은 작업이라 좀 더 고민을 해봐야하는 상황입니다.

라이트 버전이 비지니스에서 제한되고 단점을 해결할 수 있다면

첫번째 방법도 나쁘지 않을 거라고 예상하고 있습니다.
그래서 일단은 첫번째 방법을 작업을 진행해 놓은 상태 입니다.

*만약 첨부된 A의 실행 파일을 사용자가 직접 실행할 수 없는 형태로 만들 수 있는 방법이 있을까요?*

첫번째 방법으로 갔을 경우 결국은 이 문제만 해결되면 수월하게 진행될 수 있다고 생각합니다.
(vs2010 설정 만으로는 이미 생성되어있는 프로젝트의 실행파일을 조작하기 힘드네요.)

(A 프로젝트는 해당 솔루션의 다른 프로젝트들과 참조를 많이 걸고 있어서 그냥 Output Type을 Class Library로 변경할 수 없는 상황입니다.)

CruiseControl.net을 사용 중이라 빌드 결과물을 패키징 할 때 뭔가 조치를 취할 수 있을 것 같긴 한데
물론 빌드 결과물에서 그렇게 설정되는 게 가장 최상이라 그 방법을 찾는 중입니다.

평소 유용한 정보들 전해 주셔서 자주 들렀는데
구글링 해봐도 적당한 방법을 못 찾아서 이렇게 질문 드립니다.

답변 부탁드려도 될까요?



덧, 첨부된 파일은 그냥 상황이 이렇다 정도 설명하는 파일입니다.




[연관 글]






[최초 등록일: ]
[최종 수정일: 2/9/2011]


비밀번호

댓글 작성자
 



2011-02-09 05시11분
근데, "A 실행 파일을 사용자가 직접 실행할 수 없는 형태" 로 만들려면 왜 exe 로 빌드하시죠? 그냥 dll로 빌드하면 되는 거 아닌가요? 실행되어야 할 필요가 있기 때문에 exe 로 하신 것 같은데... ^^

간단하게, msbuild 를 2번 돌리시면 되지 않을까요? 한번은 target 유형을 windows app 로 하고, 다시 한번은 library 로 해서 별도로 실행되는 유형을 배포할 때는 exe 로 가져가고, B 프로젝트에 포함되어야 하는 것은 dll 로 참조시켜주고요.

(아니면, A 프로젝트의 App 타입에서 코딩을 통해 시작할지 말지를 상황에 따라 선택하게 만들수도 있습니다.)
정성태
2011-02-09 05시33분
[이성환] 답변 감사드립니다.
A 프로젝트 역시 제품으로 나가는 상황이라
빌드는 A 프로젝트 따로 , B 프로젝트 따로 진행합니다.
그리고 A 프로젝트 빌드 결과물은 직접 사용자가 실핼할 수 있어야하죠.(본 제품이니까요.)
단지 B 프로젝트 빌드 결과물은 A 결과물의 라이트 버전이므로 B 의 결과물에 첨부된 A 프로젝트 실행 파일만 사용자가 직접 실행 불가능하게 만들고 싶다 입니다.

음..
빌드를 두번 하는 것에는 이미 A 프로젝트를 dll로 뽑을 수 있다는 전제가 있는데요.(한번은 exe, 한번은 dll)
지금 상황으로는 A 프로젝트를 dll로 뽑는 건 무리가 있습니다.(무리라기 보다 덩치가 큰 작업이라 꺼리고 있습니다.)

처음부터 A 프로젝트를 dll로 뽑을 수 있었다면 이런 방법 보다는
C프로젝트를 하나 더 만들어서 본 제품은 C에서 A프로젝트를 참조해서 빌드하고, 라이트 버전은 B에서 참조해서 빌드하는 형태로 갔을 텐데요.
일단 A프로젝트를 dll로 뽑는 걸 배제하고 고민 중이라 좀 골치가 아픕니다.

마지막에 언급하신 App 에서 코딩으로 실행여부를 판단하는 방법은 가능한 지 약간 의문이 드는데요.

B 프로젝트의 결과물에 포함된 A프로젝트 실행파일(실행 파일을 비롯해 필요한 여러 파일들 포함)이 B 프로젝트의 설치 폴더에서 더블클릭 되어서 실행되었는지
아니면 실제 본 제품인 A 프로젝트 설치 폴더에서 실행되었는지 확인할 방법이 마땅지 않네요. (폴더 이름으로 실행 여부를 판단하는 건 좀...)

[guest]
2011-02-09 05시36분
[이성환] 정리하자면

B의 결과물이 클라이언트의 PC에 설치되었을 때

첨부된 A 실행파일을 사용자가 직접 더블클릭해서 실행 할 수 없도록 만들어야합니다.

물론 A의 결과물이 클라이언트의 PC에 설치되었을 때는 직접 A 실행 파일을 더블클릭으로 실행할 수 있어야합니다.

뭔가 개인적으로 매우 싫어하는 구조가 되어가는 상태가 찝찝하긴 합니다만

뾰족한 방법이 떠오르지 않아서 고민 중입니다. ;ㅅ;
[guest]
2011-02-10 01시28분
음... 'A 프로젝트를 dll 로 뽑는 건 무리'라는 것에 약간 이해가 안되는데요. EXE 프로젝트를 DLL 로 빌드하기 위해서 별도로 필요한 작업이 있는 것은 아닙니다. 다음의 글을 참고하세요.

WPF 프로젝트를 WinExe / Library 로 빌드하는 방법
; http://www.sysnet.pe.kr/2/0/993
정성태
2011-02-10 10시26분
[이성환] 오~ 글까지 써주시다니...;ㅅ; 감사드립니다.

근데 dll로 뽑기 힘들다는 건 기술적인 문제라기보다 로직상의 문제 때문입니다.

A 프로젝트는 Window Application이라 App에서 override 해서 사용한 Window의 protected 메서드가 꽤 되구요.

설명해주신 ApplicationDefinition 속성을 변경하고 빌드를 해도 no suitable method found to override 에러가 납니다.
(OnStartup, OnExit 등등.. 요것들을 override해서 에러가 납니다.. 근데 요것들을 고쳐쓰기가 좀 애매합니다.
Window에서 override로 OnClosed 같은 걸 쓰기도 했고 OnClosing 같은 Window 이벤트를 사용한 부분도 있습니다.)

또 같은 솔루션의 다른 프로젝트에서 A의 객체를 Window 타입으로 참조를 걸고 있는 것들도 꽤 됩니다.

그래서 A의 타입을 Window 에서 UserControl로 바꾸고 dll로 뽑은 다음에
본 제품은 C 프로젝트를 새로 생성해서 참조 후 빌드하고 라이트 버전은 B 프로젝트에 참조해서 빌드하려고 했죠.
근데 A 프로젝트의 규모가 꽤 크기 때문에
(자체 크기도 크지만 여기저기 참조가 물린 곳이 많아서 그것들을 다 찾고 정상동작 하기까지 테스트를 거치는 게 작업이 크다고 판단하고 있습니다.)
이 작업이 만만치가 않습니다.
(아.. 물론 좀 더 일정을 길게 잡고 달라붙어서 구조를 변경한다면 충분히 가능한 일입니다.)

이런저런 이유 때문에 A 프로젝트를 dll로 뽑는 거 배제하고 있다고 말씀드린겁니다.
하지만 이것만 해결된다면 오히려 처음 질문 한 게 필요 없어지는 상황이기도 하구요.

이렇게까지 친절하게 답변 주실지 몰랐습니다. 덕분에 도움이 많이 되었습니다.

여튼 이 문제는 좀 더 고민을 해봐야할 듯 합니다.

감사합니다.
[guest]
2011-02-10 10시39분
어쨌든... ^^ 잘 해결되시길 바랍니다.
정성태

... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4796Bere...1/13/201711664++ 후위연산자와 = 을 함께 사용할 때 생성되는 IL 코드 관련... [2]
4795김철환1/11/201712752이벤트 부분을 읽고 있는데 이해가 안되서 질문합니다.. [11]
4794김철환1/10/201710058안녕하세요 c# 6.0 책을 구매한 사람인데요 [3]
4793장준영1/7/201712098안녕하세요 c언어 처음 공부해보는 학생입니다 [4]파일 다운로드1
4792김재영1/4/201713106소스코드 공개 전 성태님의 의견을 듣고싶습니다 [3]
4791C#초보12/28/201612919비동기 소켓 close시 ObjectDisposedException 문제점 질문 있습니다.. [1]
4790미나리12/24/201613153파워포인트 쇼 제어 SimpleHttpServer.cs 작동문제 [4]파일 다운로드1
4789김솔지12/21/201611985프린트 시, 프린트하는 파일의 파일명 구하는 부분에 대해서 질문드립니다. [1]
4788짜두12/19/201611713Visual Studio 2015 에서 msbuild 12 사용 [5]
4787guest12/18/201613507VLC라이브러리에 대해 아시나요? [3]파일 다운로드1
4785Hyou...12/16/201613624WPF 개발 시 MVVM 프레임워크 사용 [2]
4784ds12/15/201610287문의 드립니다. [2]
4783후배12/13/201611886MemoryStream에 관한 질문 입니다. [5]
4782김형민12/6/201610212[ C# 6.0 ] 126p 오타인가요? [6]
4781질문자11/29/201610336ms워드 저장 오류 [1]
4780최진11/28/201614772안녕 하세요 빌드 관련해서 질문드립니다 꾸벅 [4]
4779손니11/28/201611109안녕하세요 질문하다 드려도 될까요 [3]
4778김상호11/25/201610643재귀호출->비재귀호출 [2]파일 다운로드1
4777권오영11/12/201612890아래 질문 상세 소스전체입니다.. [3]
4776권오영11/11/201610816제가 이클립스를 공부중인데..이상한것을 찾았습니다.. [2]
4775이성환11/11/201614261안녕하세요. SnapsToDevicePixels 질문입니다. [5]파일 다운로드1
4774popo11/10/201610882.net SSL통신 관련 질문 드립니다. [1]
4773김상호11/4/201613375재귀함수 반복문 변환 [1]파일 다운로드1
4772자연인10/27/201614360hwpctrl을 사용하는 사이트에서 나와 브라우저를 종료하면 오류메세지가 나옵니다. [1]파일 다운로드1
4771문종훈10/18/201614402.net 소스 질문이 있습니다 [2]
4770누구게~...10/15/201611633세도나 [1]
... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...