2012-01-14 2 views
5

다른 버전의 어셈블리를로드해야합니다 (이미 응용 프로그램에 같은 이름의 어셈블리가 있습니다).리플렉션을 사용하여 동일한 어셈블리의 서로 다른 버전에서 클래스 개체 사용

어셈블리를로드하고 리플렉션을 사용하여 호출해야하는 메서드를로드 할 수 있었지만 클래스 개체를 인수로 전달하여 메서드를 호출 할 때 클래스 개체를 해당 형식으로 변환 할 수 없다는 예외가 발생했습니다. 인수 매개 변수

샘플 코드 -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

여기 매개 변수 내가 어셈블리에 있지만 매개 변수 클래스는 현재 버전의 어셈블리에서 생성되기 때문에이 클래스의 객체이다. 그리고 이전 어셈블리의 메서드를 전달하려고 할 때 변환 할 수 없다는 예외가 있습니다.

어떻게하면됩니까? 더 자세한 정보를 여기에 입력해야 할 경우에 대비하여 알려주십시오. 미리 감사드립니다.

+0

틀릴 수도 있지만, 이해할 수있는 한, 다른 버전의 어셈블리를로드하려면 다른 응용 프로그램 도메인이 필요합니다. 그렇지 않으면 이미로드 된 버전이 사용됩니다. – Vlad

+0

아니요, 동일한 앱 도메인 내에 어셈블리를로드 할 수있었습니다. 유일한 문제는 하나의 버전에서 만든 매개 변수를 다른 버전으로 전달하려고 할 때 발생합니다. 리플렉션을 사용하여 같은 버전에서 만든 객체로 메서드를 호출하려고하면 잘 동작합니다. –

+0

가능한 [서로 다른 어셈블리 버전간에 클래스 객체 전달] (http://stackoverflow.com/questions/8871079/passing-class) -objects-across-different-assembly-versions) –

답변

2

MEF (Managed Extensibility Framework)를 확인해야합니다. AppDomains와 다른 어셈블리에 대해 걱정하지 않아도되므로 훨씬 쉽게 처리하고 추상화 할 수 있습니다.

편집 :

당신은 단지 당신이 원하는 것을 달성하기 위해 반사를 사용하고자하는 경우, 응용 프로그램 내에서 유연한 개체 모델을 필요로합니다. 이 접근 방식의 기본은 MEF가 수행하는 작업입니다. 당신이 정말로 이것을 할 수있는 힘을 얻는 곳은 닷넷 리모팅입니다. 그래서 그것에 대해 읽어 보시기 바랍니다.

당신이 필요로하는 것들 :

  • (어셈블리 A)에서 응용 프로그램.

  • 구 클래스 코드 (어셈블리 C)로 어셈블리.

  • 두 번째 AppDomain에 대한 프록시/원격 기능을 수행하는 원격 로더 클래스.

  • 클래스의 이전 버전 인스턴스를 나타내는 프록시 클래스입니다.

  • 프록시 클래스와 원격 로더가 포함될 어셈블리 B입니다.

다음은 시도 할 수있는 작업은 다음과 같습니다 조립체 (A)

  • 에서

    1. 로드 응용 프로그램은 새 응용 프로그램 도메인 인스턴스를 만듭니다.

    2. 어셈블리 B.

      A로부터 새로운 응용 프로그램 도메인에서 "원격 로더"클래스의 인스턴스를 인스턴스화합니다. 그러면 어셈블리 B가 AppDomain에로드됩니다.

    3. "원격 로더"에서 어셈블리 C를로드하고 이전 클래스를 인스턴스화 한 다음 프록시 클래스의 인스턴스를 원래 AppDomain으로 다시 전달합니다.

    4. 이제는 프록시와 새 클래스 버전이 모두 구현할 수있는 더 일반적인 버전의 객체 (인터페이스 일 수도 있습니다)를 허용하도록 메소드를 수정할 수 있습니다.

  • +0

    +1 .. 고마워, 이것을 들여다 보겠다.하지만 지금은 내 응용 프로그램과 통합 할 수 없다. 리플렉션을 사용하는 방법이 있습니까? ?? –

    +0

    리플렉션 전용 방법으로 업데이트했습니다. 실제로는 복잡한 해킹이 될 수 있으므로 달성하려는 내용을 다시 생각해 보시기 바랍니다. – doogle