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)
4957멍멍이2/13/20189627System.Console - WriteLine함수의 제너릭 사용 [1]
4956김성대2/12/20188957asp.net 질문입니다. [1]
4955웅이2/12/20189503[삭제] WPF에서 list 속도 향상하는 방법이 있을까요?
4954초보자2/8/201811245FFT Library 사용 [1]
4950ASP열공2/5/20189012asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4951ASP열공2/6/20189981    답변글 [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4952ASP열공2/7/20189129        답변글 [답변]: [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4953ASP열공2/7/20188632            답변글 [답변]: [답변]: [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다.
4949김성대1/31/201810367비동기 질문입니다. [3]파일 다운로드1
494880511/31/20189130C# 7.1책 보다가 질문드립니다 [1]
4947김성대1/30/201810359[삭제] 비동기 질문입니다. [2]파일 다운로드2
4946윤현수1/29/20189912비동기 TCP통신 데이터 문제 [4]파일 다운로드1
4945김성대1/26/20188439비동기 질문입니다. [1]파일 다운로드1
4944popo1/25/20187866[삭제] 스레드 안에서 Window Visibility 변경시 DialogResult 오류 질문
4943김성대1/22/20188850FromAsync 질문입니다. [1]
4942박현일1/19/201810452WPF 공부중 모르는 문법이 있어서요~^^; [2]
4941김성대1/18/20188711비동기예약어 실행오류관련입니다. [1]
4940plzh...1/10/20189632webbrowser2 를 이용한 sns 로그인 구현 관련 문의 [2]
4939이성일1/4/201811132ClickOnce 배포 후 업데이트 시 발생하는 오류에 대해 질문 드립니다. [2]
4938김성대1/3/20189184채팅 프로그램관련 질문입니다. [9]파일 다운로드1
4937Ques...1/3/201811539C# CPU 사용량 한계치 늘리는 방법 [2]
4936무개1/3/20188693책 내용 인용하는 것에 관한 질문이있습니다. [1]파일 다운로드1
4935몬난아12/28/201711451IIS 및 ASP.NET 이 서버에서의 동작방식? [2]
4934Ques...12/26/201721742C# 해상도에 따른 자동 사이즈 조절방법이 궁금합니다. [3]
4933Kay12/15/20179118C# VS 버전 에러 질문 드립니다. [1]파일 다운로드1
4932정환나라12/13/20179040vs2013에서 빌드한 com 컨트롤 객체를 닷넷 2.0에서 사용하려 합니다 [4]
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...