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)
4745힘찬도약7/27/201612050.NET 자식창 데이터를 부모창에 전달시 오류 질문드립니다. [4]파일 다운로드1
4744변찬연7/27/201611811안녕하세요 그 edge를 이용하는 데 조금 불편함이 있어서 문의드립니다 [1]
4743딸랑구아빠7/26/201610744IE 사용 시 인증 정보 계속 보내기? [1]
4741차가워7/20/201612367UWP 에서 COM 참조 불가능한가요? [6]
4740luna...7/19/201612769clickonce manifest 파일 질문 [1]
4739윤똘씨7/19/201612212정말 감동적입니다... [7]
4738닷넷초보7/7/201611090안녕하세요. C#의 개체 전달방식(참조)에 관련해서 질문 있습니다. [3]파일 다운로드1
4737beau...7/6/201613409python embedding 한 c++ 프로그램의 배포에 관해서 질문드리고 싶습니다. [1]
4736spow...7/6/201610298Property Lambda에 대한 심층 분석을 의뢰합니다 [7]
4735힘찬도약7/5/201611427.Net/Web.config에서 MSSQL을 쓰는데, MysqlSiteMap 참조오류 [3]파일 다운로드1
4734spow...6/28/201611000Visual Studio 2015 + Windows Forms 환경에서 컴파일 할 때 드물게 개발환경이 Crash 됩니다 [1]
4733feel...6/15/201611461타 서버로 소스 이전 중 [3]파일 다운로드1
4732구봉근6/14/201610204안녕하세요 [1]파일 다운로드1
4731초급개발자6/7/201612755Windows Form Application는 사라질까요? [2]
4730김시현6/4/201610809책으로 공부하던 도중 생성자에 대해서 궁금한게 생겼는데 혹시 답변좀 해주실수 있나요? [1]
4729Jeah...6/3/201612262C#.Net 프로그램에서 C++로 만들어진 dll 파일 이용관련 문의 하나 드립니다. [3]
4727링거5/30/201610914WPF MediaElement 파일 실행 후 삭제시 오류 문의 [1]파일 다운로드1
4728링거5/30/201611287    답변글 [답변]: WPF MediaElement 파일 실행 후 삭제시 오류 문의 [2]파일 다운로드1
4726spow...5/25/201610730덧글을 달고 나서 F5를 눌렀을 때 똑같은 덧글이 달리는 현상 고쳐주세요 [4]
4725Futu...5/23/201611190책 잘보고 있습니다. Task관련 질문을!!! [1]
4724학생15/23/201612472웹소켓과 소켓 관련해서 질문 드립니다. [2]
4722지나가던...5/15/201614303Part 3 pdf파일 그림 재수정 문의 [1]
4723지나가던...5/16/201611546    답변글 [답변]: Part 3 pdf파일 그림 재수정 문의 [1]
4721김종희4/30/2016116943D 시뮬레이션 개발 [1]
4720DC4/29/201611086C# 6.0 델리게이트 인스턴스화 관련 질문~ [2]
4719이민구4/29/201612029[시작하세요! C# 프로그래밍] 4.5.1.6 열거형 마지막 예제 질문입니다. [4]파일 다운로드1
... 31  32  33  34  35  36  37  38  39  40  41  42  43  [44]  45  ...