Microsoft MVP성태의 닷넷 이야기
Assembly.LoadFrom Assembly.Load 의 차이점이 궁금합니다. [링크 복사], [링크+제목 복사]
조회: 11748
글쓴 사람
이성환 (vactorman at naver.com)
홈페이지
첨부 파일

안녕하세요. Assembly.Load를 사용하다가 의문점이 생겨서 질문 드립니다.

상황은 이렇습니다.

A(콘솔), B(DLL), C(DLL), D(DLL) 총 4개의 project 가 있습니다. (모두 한 솔루션 안에 있습니다.)

A가 실행되는 project 이고, B는 A에서 호출하여 동작할 메서드를 가지고 있는 클래스 입니다.

C는 특정 값을 들고 있는 클래스이며, D는 공통적으로 형변환을 수행할 목적으로 만든 interface 입니다.

각 project는

A 가 B, D를 참조하고 있고,

B 는 C, D를 참조하고 있고,

C 는 D를 참조하고 있습니다. (C는 D를 상속 받았습니다.)

좀 더 쉽게 말하자면

A는 특정 동작을 수행하는 B를 참조하고 있고, 형변환을 위해 D를 참조 하고 있으나 C의 존재는 모르는 상황입니다.
(C처럼 D를 상속받은 임의의 클래스가 더 추가 될 수 있습니다.)

하지만 A는 C와 같은 임의의 클래스 모르며 C와 같이 dll 파일을 로드하여 D로 형변환하여 B에게 넘겨 주기면 하면 되는 상황입니다.

B는 실제 동작을 수행하기 위해 C 타입을 알고 있으며 D 타입으로 넘어온 객체를 C 타입으로 형변환하여

특정 동작을 수행합니다.

실제 A가 시작되면

C.dll을 Assembly.Load()를 이용해 Assembly 객체를 얻고 다시 여기서 GetType(클래스이름) 으로 Type 객체를 얻습니다.

이 Type 객체를 Activator.CreateInstance()으로 object로 얻어온 뒤 이 객체를 D로 형변환 합니다.

형변환된 D객체를 B에 넘기면, B에서는 D를 다시 C로 형변환 한 후 특정 동작을 수행합니다.
 
 
글로 설명하려니 엄청 복잡하네요.

여튼,

문제는 여기서 Assembly.Load() 를 이용해 C를 인스턴스 하면 이후 B에서 형변환할 때 실패 한다는 것입니다.

Break Point를 걸어서 형변환 여부를 확인해보면 Debug Watch 창에서는 모두 성공한 것으로 나옵니다.(is, as 모두 성공)

하지만 실제 코드가 수행되면 형변환은 실패합니다.

그래서 Assembly.Load() 대신 Assembly.LoadFrom()으로 C를 인스턴스 하면 형변환에 성공하여 정상적인 동작이 진행됩니다.
(설명은 복잡한데 첨부한 예제를 보시면 바로 이해하실 거라 믿습니다. 언어의 한계가... ;ㅅ;)


제가 알기론

Assembly.LoadFrom()은 내부적으로 Assembly.Load()를 수행하는 것으로 알고 있는데
(물론 전달하는 파라미터에 따라 Assembly 검색 수준이 달라지겠지만...)

결국 결과가 같은 동작을 한다고 생각하고 있었는데 아니었나 봅니다.

왜 이런걸 까요?(미천한 영어 때문에 이런 주제로는 구글을 돌려도 잘 모르겠더군요...;ㅅ;)









[최초 등록일: ]
[최종 수정일: 5/23/2012]


비밀번호

댓글 작성자
 



2012-05-23 09시58분
Load와 LoadFrom은 다릅니다. 이에 대해서는 다음의 글에서 아주 자세하게 설명해 주고 있습니다.

BindingContext - Load() vs. LoadFrom()
; http://dalbong2.net/entry/BindingContext-Load-vs-LoadFrom
정성태
2012-06-01 09시30분
[이성환] 잘 이해가 안 되지만...

결론은 LoadContext와 LoadFromContext의 차이인 것이군요.

AppDomain의 격리를 위해 로딩 방식이 다른 두 Context가 공유되지 않는다 정도로 이해했습니다.

몇 가지 어셈블리 로딩 시 주의해야할 점을 공부하게되었네요. 답변 감사드립니다./(__)\
[guest]

... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1553spow...4/18/201512121    답변글 [답변]: 마이크로세컨드 단위의 Sleep이 필요한데 찾질 못하겠습니다. [1]
1551인디언기...4/16/201511519iisnode에 대해서 글 올리셨던데 질문이 있습니다 [1]
1549김선아4/15/201511962.net framework 4.5와 c++ dll에 관한 질문입니다 [1]
1550김선아4/15/201510374    답변글 [답변]: .net framework 4.5와 c++ dll에 관한 질문입니다 [2]
1547문명식4/3/201512413IWebBrowser Key Event 관련 [2]
1545나종식3/25/201511391internet explorer dns cache flush [2]
1543이용원3/23/201511365hyper-v 질문드려요! [1]
1544이용원3/24/201510495    답변글 한가지만 더 여쭤볼게요! [1]
1541임기성3/20/201517703Microsoft.Office.Core dll관련 문제 [1]
1539펜플3/17/201511065asp.net 질문입니다. [1]
1540113/17/201511048    답변글 [답변]: asp.net 질문입니다. [1]
1538열공합시닷3/13/201511858중계서버 질문드립니다 [1]
1537김재영3/11/201512888asp.net의 빌드 유휴시간 이후의 리빌드 작업을 컨트롤 할 수 있습니까? [2]
1536솔솔3/9/201511351mac address얻으려고 하는데요.. [1]
1535Stud...3/4/201511897C#엔 MFC의 theApp 과 같은 기능을 하는것이 없나요? [3]
1534김동진3/4/201511327C#에서 BHO로 Windows Explorer에서의 동작이 가능할지요 [2]
1533김동현3/3/201511590컴파일 된 프로그램에 코드 삽입(?) 관련입니다. [1]
1532반가워요3/3/201514174C# 소켓연결에 packet송수신... [8]
1531강현수3/2/201512821C# com 등록 시 GUID 변경 관련 문의 [1]
1529김민규2/15/201512736C++ 64bit/32bit [3]파일 다운로드1
1528김개똥2/14/201510223좀 관련없는 질문이지만, 정말 답답하고 찾는데 명확한 해답 찾지못해 질문 올립니다. <Windows 사용자 인증> [1]
1527방문자1/27/201511245System Timer의 Tick에서 Backgroundworker를 호출하면 스레드 문제가 있을까요? [1]
1526황상대1/26/201513084C# 마샬링 관련 질문이 있습니다. [1]
1525Ji-y...1/19/201511690시작하세요 C# 프로그래밍 도서에 관한 질문입니다. [1]
1523임종복12/31/201419074windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [3]
1524임종복1/4/201514012    답변글 [답변]: windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [2]
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...