2012-02-09 3 views
3

는 DLL에 다음 코드를 고려 반사를 통해로드 :동적으로 해결하는 유형

public class ReceivingClass 
{ 
    private Assembly myAssembly; 
    private Type typeOfClass; 
    public ReceivingClass() 
    { 
     myAssembly = Assembly.LoadFile(@"E:\VSProjects\TestDynamicLinking\MyLib\bin\Debug\MyLib.dll"); 
     //Can I use this type somehow to resolve the type in the below method? 
     typeOfClass = myAssembly.GetType("ExportedClass"); 
    } 
    public bool ReceiveMethod(ExportedClass classobj) 
    { 
     return true; 
    } 
} 

그래서, 문제는 위의 ReceiveMethod에, ExportedClass 어셈블리에 정의 된 클래스가 있다는 것이다을하는 I 생성자에 동적으로로드됩니다. 그래서, 어떻게 든 ExportedClass의 유형을 해결할 수 있습니까? dynamic을 사용할 필요가 없습니까? 당신이

답변

5

일부 선택은

  • 공유 인터페이스를 사용하여, (아마 당신이 동적으로로드로 귀하의 경우 불가능) 실제 조립 중

    • 참조되는 유형의 구현 (단지 당신이 할 수있는 경우 ,
    • 를로드 어셈블리를) 편집하거나

    나는 보통 두 번째 방법을 사용하는 것이 동적/반사를 사용합니다. ExportedClass가 다른 (공유) 어셈블리에서 구현하는 인터페이스를 정의하면됩니다. 그런 다음 생성 된 인스턴스를 해당 인터페이스로 캐스팅 할 수 있습니다. 이렇게 :

    ISomeInterface obj = Activator.CreateInstance(typeOfClass) as ISomeInterface; 
    

    물론, 참조 된 라이브러리를 제어 할 수 있다고 가정합니다. 또는 플러그인 인프라 또는 이와 유사한 것을 정의하는 경우이를 요구 사항으로 포함해야합니다.

    1

    그렇게 같은 코드에서 메서드 서명이있는 경우 :

    public bool ReceiveMethod(ExportedClass classobj) 
        { 
         return true; 
        } 
    

    이미 어셈블리를 참조하고 의미합니다. 동적으로로드 할 필요가 없습니다. 또한 리플렉션을 통해 유형을 얻습니다. 그런 다음 해당 유형의 객체를 만들어야합니다.

    동적은 모든 유형의 객체에 대한 참조 만 보유 할 수 있지만 객체를 인스턴스화하지는 않습니다. Activator.CreateInstance을 사용하여 인스턴스를 만든 다음 결과 개체를 알고있는 특정 유형으로 쉽게 캐스팅 할 수 있다고 가정합니다.

    그러나 특정 유형을 알고있는 경우 객체의 공유 인터페이스 또는 기본 클래스를 수락하지 않는 한 이미 어셈블리에 대한 참조가있을 수 있지만 그 메소드는 그 클래스에 정의 된 클래스의 객체를 허용한다고 말합니다 어셈블리를 참조하고 있으므로 이미 어셈블리를 참조하고 있습니다.

    당신의 방법 서명이 그런식이 아니고 @ Botz3000과 같은 옵션이 무엇인지 알고 싶다면 반사, 동적 또는 공유 인터페이스를 사용할 수있다.

    관련 문제