Microsoft MVP성태의 닷넷 이야기
Assembly.LoadFrom Assembly.Load 의 차이점이 궁금합니다. [링크 복사], [링크+제목 복사]
조회: 11759
글쓴 사람
이성환 (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]

... 16  17  18  19  20  21  22  23  24  25  26  27  28  29  [30]  ...
NoWriterDateCnt.TitleFile(s)
5130노인코래방2/25/201910753C#에서 가장 좋은 성능을 보이는 파일 읽고 쓰는 방법이 무엇인가요? [2]
5129진우2/23/201910213닷넷 32비트 기반에서 메모리 부족으로 프로그램이 죽는경우 문의 [2]
5128게스트2/23/20197884안녕하세요. 초보개발자입니다. [3]파일 다운로드1
5127c#2/20/20196947책에 예제 문의드립니다. [2]
5125게스트2/19/20197016delegate를 활용한 event 를 적절히 불러오고 싶습니다. [2]
5124정근화2/12/20196897윈도우 서버2003 환경 오류 [2]
5123김주현2/8/20196968MS LUIS 에 대한 소개 하실 계획이 있으신가요? [1]
5122jaka...2/1/20198824Clickonce 배포 후 Command 실행 [2]파일 다운로드1
5121엔벌이1/31/20198286C# DataGridView의 MDB파일 함수? ArrayList? [1]파일 다운로드1
5120임우진1/30/20198814웹에서 응용프로그램 바로 실행하기 관련 브라우저에서 파라미터가 넘어오지 않습니다.ㅜㅜ [2]
5119guest1/29/201910181교재에 오탈자 있어 알려드리려 합니다 [1]
5118WPF꿈...1/26/20198149GetHashCode 메서드에 대해서 [1]
5117하주형1/25/20198756List<int>에 대한 이해가 잘안됩니다. [5]
5116게스트1/24/20197534asp.net 관련 gridview webform 질문 드립니다. [1]파일 다운로드1
5115Soul...1/24/20197705투명 패널 질문드립니다. [2]
5114박현일1/20/20198036WPF DataContext 관련 초보 질문을 드려봅니다.^^ [5]
5113하주형1/20/20197298안녕하세요 시작하세요 C# 인코딩관련 질문드립니다. [1]
5112손성배1/19/201916252안녕하세요 cp949 인스톨시 오류입니다... 너무 힘들어요 [5]
5111게스트1/10/20197932암호화 라이센스 관련 문의 드립니다. [1]
5110WPF꿈...1/9/20197580Thread Abort 함수 사용시 [2]
5109닷넷개발1/9/20197545thread 관련 질문 예제.. [2]파일 다운로드1
5108닷넷개발1/9/20198686thread 관련 질문 드립니다.. [4]
5107우코아1/4/201911259WPF에서 로딩중 이미지를 구현 - Project [5]파일 다운로드1
5106우코아1/3/20198909WPF에서 로딩중 이미지를 구현 - Source [1]
5104우코아1/1/201910177WPF에서 로딩중 이미지를 구현 [4]
5103이혜성12/31/20181076932bit .net 으로 만들어진 dll파일 [5]
... 16  17  18  19  20  21  22  23  24  25  26  27  28  29  [30]  ...