Microsoft MVP성태의 닷넷 이야기
글쓴 사람
이성환 (vactorman at naver.com)
홈페이지
첨부 파일
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을 사용 중이라 빌드 결과물을 패키징 할 때 뭔가 조치를 취할 수 있을 것 같긴 한데
물론 빌드 결과물에서 그렇게 설정되는 게 가장 최상이라 그 방법을 찾는 중입니다.

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

답변 부탁드려도 될까요?



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




[연관 글]


donaricano-btn



[최초 등록일: ]
[최종 수정일: 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 프로젝트 설치 폴더에서 실행되었는지 확인할 방법이 마땅지 않네요. (폴더 이름으로 실행 여부를 판단하는 건 좀...)

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

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

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

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

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

뾰족한 방법이 떠오르지 않아서 고민 중입니다. ;ㅅ;
[손님]
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로 뽑는 거 배제하고 있다고 말씀드린겁니다.
하지만 이것만 해결된다면 오히려 처음 질문 한 게 필요 없어지는 상황이기도 하구요.

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

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

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

... 31  32  33  34  35  36  37  38  39  40  41  42  43  44  [45]  ...
NoWriterDateCnt.TitleFile(s)
1018강한구12/29/20118657WPF ClickOnce 배포시 콤포넌트 dll 다운로드 문제에 대하여 질문 있습니다. [1]
1017임동찬12/28/20116386smart client와 xbop, silverlight [6]
1015개똥이12/22/20115044RMCLOCK 설정 관련 질문이요ㅜ [2]
1011사길수12/16/20114390hyper-v 이더넷 카드 관련 문의 좀 드립니다. [1]
1006루로니12/13/20116706윈도우7과 XP의 DLL후킹 처리에 관해서 질문입니다. [3]
1005남산골12/13/20115936안녕하세요!! 첫 인사드립니다. [3]
1004뽀로로12/11/20113930Managed 어셈블리에서의 COM EntryPoint procaddress 문제 [1]
1003나그네12/8/20116199닷넷에서 가상메모리(Commit) 의 크기를 줄이거나 해제하는 방법은 어떻게 해야할지요? [1]
1002나그네11/29/20114652안녕하세요 ^^ 문제가 생겨서 혹시나 여기서라면 답이 나오지 않을까 해서.. [1]
1001선무당11/29/20115393clickonce+ntd 시스템에서 proxy Server 가 개입되는 경우 cache 해결을 위한 방법... [1]
1000초보개발자11/28/20114544웹서비스용 웹 서버의 SSD 가치에 대해서... [1]
999날쌘돌이11/25/20115050ADFS와 WIF 질문 [1]
998윤용한11/9/20115058File Write 도중 정전 발생 시 대처 방법 있나요? [2]
997조장원11/7/20114664Silverlight 에서의 Auth 방법에 대한 고찰 [2]파일 다운로드1
996파몽11/3/20118192VS2010 에서 타겟플랫폼이 x86으로 변경이 된걸일까요? [2]
995강신명10/24/20114827sharepoint2010+win7 client 오류 [2]파일 다운로드1
992라이언10/11/20115623캡션에 chapter numbers 넣기
993정성태10/11/20117387    답변글 [답변]: 캡션에 chapter numbers 넣기
991우상욱8/21/20119194세션 타임 아웃에 관해서 질문드립니다. [2]
990김재영8/20/201112306VS2010의 윈폼의 Load이벤트에서 예외가 잡혀지지 않습니다. [3]파일 다운로드1
989우상욱8/20/20115776polling에 대해 감이 안잡혀서 질문드립니다 [1]
988WooYoung Moon8/17/20116572성태님~ 작은 부탁 하나 있습니다~ [2]
987에스패스트8/3/20117508비밀글쓰기가 있으면 참좋을탠대 아쉽네요 ^^ 저 한가지만더.. [5]
986에스패스트8/3/201110177안녕하세요 ^^ 이렇곧도 있군요 ~ 참좋네요 질문 한가지 여쭤볼게요 [6]
985이성환7/28/20117024P/Inovke 관련 질문입니다. [4]파일 다운로드1
983이성환7/13/201113187Mouse이벤트 관련해서 질문있습니다. [10]파일 다운로드2
... 31  32  33  34  35  36  37  38  39  40  41  42  43  44  [45]  ...