2016-07-01 3 views
2

제 3 자 .Net 어셈블리를 사용하면 "dotnet-namespace.dotnet-type from .Net assembly dotnetassembly.dll."을 사용하는 ThridParty.dll이라고 할 수 있습니다. 새로운 버전의 dotnetassembly.dll "dotnet -type "은 새로운 dotnet-namespace라고하는 새로운 네임 스페이스로 이동되었습니다 dotnet-type의 완전한 이름은 new-dotnet-namespace.dotnet-type이되었습니다C#의 네임 스페이스 문제 유형

이제 내 질문 새로운 이름 공간 즉, 이전의 네임 스페이스 즉 dotnet-namespace 대신에 새로운 네임 스페이스 즉, dotnet-type을 찾기 위해 런타임을 말할 수있는 방법이 있습니까?

원하는 경우 어셈블리 리다이렉션을 사용할 수 있습니다. 생각 나게하다 새 버전의 어셈블리가 있지만 동일한 어셈블리 내에서 유형을 다른 네임 스페이스로 리디렉션 할 수 있습니까? 새로운 네임 스페이스의 형식을 사용하는 새 버전의 thridparty.dll을 얻을 수있는 옵션이 없습니다.

+1

이것을 달성하는 것은 매우 큰 사업이 될 것입니다. 일종의 디 컴파일을 할 수있는 코드를 작성하고 결과를 파싱하여 원하는 것을 찾으십시오. –

+1

물론 코드를 다시 컴파일하십시오. 다른 것이 가능하고 실용적이며 비생산적이라고 가정합니다. 마이크로 소프트는 이런 종류의 와플에 상당히 단단한 발을 내려 놓았습니다. 리플렉션을 사용하려면 여기 아무도 당신을 막을 것입니다. –

+0

다른 의견에 동의합니다. 당신은 할 수 있겠지만, 네임 스페이스를 바꾸기로 선택한 사람들과 말하고 싶습니다. –

답변

3

아니요. 닷넷 프레임 워크에서는 한 유형을 다른 유형으로 리디렉션하지 않습니다.

네임 스페이스는 소스 코드에서 이름을 더 짧게 만드는 구문적인 설탕입니다. .NET 자체 네임 스페이스는 형식 이름의 일부이기 때문에 기본적으로 "유형을 다른 유형으로 가리킬 수 있습니까?"

솔루션 :

  • 빌드 프록시 조립
  • 재 IL 새로운 유형을 가리 키도록

    • 재 컴파일.

      public Type FindType(string typeName, string assemblyName) 
      { 
          Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(a => a.GetName().Name == assemblyName); 
          return assembly != null ? assembly.GetTypes().SingleOrDefault(t => t.Name == typeName) : null; 
      } 
      

      당신이 부를 것이다 : :에 대해 어떻게

  • +1

    LOL ... 코드를 변경하고 네임 스페이스를 수정하는 것보다 많은 노력이 필요합니다. – Rahul

    0

    Type dotNetType = FindType("dotnet-type", "dotnetassembly"); 
    

    이 유형의 네임 스페이스의 독립이 방법.

    부작용으로, 어셈블리에 같은 이름을 가진 두 가지 유형이있는 경우 반환 할 유형을 알 수 없으므로이 방법은 간단히 작동하지 않습니다 (실제로는 예외). SingleOrDefaultFirstOrDefault으로 변경하고 첫 번째 발생을 되돌릴 수 있습니다.

    당연히 당신은 런타임에 타입을 찾을 것이기 때문에 모든 컴파일 타임 이점을 잃을 것입니다.

    +0

    어셈블리에 동일한 'typeName'을 가진 여러 유형이 있다면 어떻게 될까요? –

    +0

    좋은 질문입니다. 나는 이것이 같은 이름의 타입들에서는 작동하지 않는다는 것을 분명히해야한다. –