2009-10-06 2 views
3

은 다음과 같은 간단한 코드에서 컴파일 된 Class.dll 어셈블리 주어진 가정하자 :Assembly.GetType() 및 대해서 typeof()는 서로 다른 형태를 돌려주는?

namespace ClassLibrary 
{ 
    public class Class 
    { 
    } 
} 

을 그리고 프로젝트 참조로 다음과 같은 코드로 Class.dll 위의와 다른 프로젝트를 고려하십시오

Assembly assembly = Assembly.LoadFrom(@"Class.dll"); 

Type reflectedType = assembly.GetType("ClassLibrary.Class"); 
Type knownType = typeof(ClassLibrary.Class); 

Debug.Assert(reflectedType == knownType); 

어설 션이 실패하고 그 이유를 이해하지 않습니다.

예를 들어 System.Text.RegularExpressions.Regex 클래스와 System.dll 클래스 파일로 ClassLibrary.Class를 대체하면 어설 션이 성공합니다. 따라서 프로젝트 속성과 관련이 있다고 생각합니다. ? 아마도 일부 컴파일 스위치가 있을까요?

미리 감사

답변

8

문제 부하 상황이다 .LoadFrom 통해로드 어셈블리 퓨전 (.Load)에 의해로드 된 것과 상이한 "더미"로 유지된다. 유형은 CLR과 실제로 다릅니다. CLR 아키텍트의 자세한 내용은 this link을 확인하십시오.

+0

당신은 그것을 못을 박았다 (-) Assembly.Load를 사용하여 문제를 해결. 고마워요! 다른 클래스 라이브러리에 대한 외부 참조가없는 –

2

에 당신은 아마 동일한 어셈블리의 두 개의 서로 다른 복사본을로드하고 있습니다.

는 디버거에서 reflectedType.AssemblyknownType.Assembly을 비교하고, 경로 및 버전을 확인합니다.

2

나는 당신이 디스크에서로드하는 동일한 어셈블리를 참조하지 않는 것을 상상할 것이다.

이 예 (Test.exe로 컴파일) 잘 작동합니다 :

using System; 
using System.Reflection; 

class Example 
{ 
    static void Main() 
    { 
     Assembly assembly = Assembly.LoadFrom(@"Test.exe"); 

     Type reflectedType = assembly.GetType("Example"); 
     Type knownType = typeof(Example); 

     Console.WriteLine(reflectedType == knownType); 
    } 
} 
+0

의 asp.net MVC 응용 프로그램입니다. –