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분
어쨌든... ^^ 잘 해결되시길 바랍니다.
정성태

... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
3695Bere...2/15/201612870호출당한 메서드가 호출한 메서드를 알 수 있는 방법이 일반적인 방법 말고도 있을까요? [2]
3693조영준2/11/201613543UWP 앱을 만들고 있습니다. 죄송하지만 몇 가지 질문 드립니다. [4]
3692후배2/8/201612472html/css/js를 이용한 winForm의 UI표현이 가능 한가요? [3]
3690김대석2/5/201610950문의 드립니다. [2]
3687허재영2/3/201612540web api 보안관련 질문입니다. [2]
3685조진우2/1/201612475메인 응용 프로그램에서 DLL을 실시간으로 접근하여 사용하는데 이것을 모니터링 할 수 있을 까요? [1]
3684나그네1/27/201611809안녕하세요..wcf 관련하여 질문있습니다. [4]파일 다운로드1
3683김태형1/25/201612108 안녕하세요 저작도서를 구매하려는데 한가지 문의 사항이 있어서 질문드립니다. [1]
3681이영균1/8/201614706IE브라우저 추가기능관리의 항목을 사용함으로 c#코드로 변경을 하려고 합니다. [8]
3680후배1/6/201614926추천할만한 소켓 라이브러리 있으신가요? [2]
3679초록물꼬기1/6/201613783Parallel.For 에서 동기화문제에 관한 질문입니다. [11]파일 다운로드1
3678김민우1/3/201612216IHS 오류에 대한 질문입니다. [2]파일 다운로드1
3677초록색우산12/31/201513790HTTP 통신 - WebClient 이용시 한글깨짐 현상 발생 [2]
3676서정열12/31/201512614안녕하세요 WebService SoapExtensionImporter 에 대해서 질문드립니다. [3]
3675차가워12/30/201511682윈폼, 폼인폼 상황에서 하위컨트롤 포커스 문제 [1]
3673Sung...12/24/201512739UWP예외 발생 : 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll) 해결방법 [2]
3672Sung...12/23/201511999global::System.Diagnostics.Debugger.Break();가 노랗게 표시될시 [2]
3671이상준12/22/201516170한글 키보드 입력에 대해서 질문이 있습니다. [3]
3670Sung...12/18/201512947UWP 주기적으로 신호를 보내고 클라이언트에서 신호가 오면 받는 프로그램을 하려고 합니다. [5]
3669다비드12/18/201511237인터넷 임시파일 삭제 관련 질문. [1]
3668김치사발면12/16/201510696템플릿이 자꾸 초기화? 되버리네요 [1]
3667김치사발면12/15/201510619템플릿 설정 추가 질문 [1]파일 다운로드1
3666노태현12/15/201510026사용자별로 권한을 주고 볼 수 있는 데이터를 제한하려면 어떤 방법으로 접근하는게 좋을까요? [2]
3665김치사발면12/14/201513123C# 템플릿 설정이 이상해요ㅜㅜ [3]파일 다운로드1
3664KuLu12/10/201510437멀정하던 사이트 중 일부메뉴가 응답없음이 되어버립니다. [3]
3663Sung...12/10/201511826UWP 서버 프로그래밍 작업 중 [5]
... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...