2014-05-19 1 views
0

C#에서 동적을 사용하여 외부 API (DLL)에 정의 된 개체와 상호 작용하고 싶습니다. 그런 식으로 내 콘솔 앱에서 API를 참조하고 싶지 않습니다. 이게 가능합니까?DLL을 참조하지 않고 C#에서 동적 사용

dynamic obj1 = new ObjectDefinedInAPI(); 

컴파일러가

The type or namespace name 'objectDefinedInAPI' could not be found ... 

어떤 생각을 잔소리에 유지 : 예를 들어

, 나는 같은 것을 사용?

감사

+2

동적으로 어셈블리를로드하십시오. 키워드'dynamic'은 멤버 바인딩이 지연되고 런타임에 완료된다는 것을 나타냅니다. –

+0

@HamletHakobyan이 지침을 제공함에 따라 여기 [참조 튜토리얼] (http://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110) .aspx)이 있습니다. 상호 운용하려는 어셈블리는 어느 시점에서 메모리에로드되어야합니다. Windows API를 생각하면'DllImport'를 사용해야합니다. 그것들을 메모리에로드합니다. –

+0

이 경우 ServiceLocator 패턴과 서비스 인터페이스가 포함 된 라이브러리를 사용해야한다고 생각합니다. 이 라이브러리는 콘솔 응용 프로그램과 해당 인터페이스를 상속하는 클래스의 실제 구현을 포함하는 라이브러리 모두에 공통적이어야합니다. 그런 다음 DLL을 동적으로로드하고 ServiceLocator 컨테이너에 자동으로 등록되도록 할 수 있습니다. –

답변

0

NeutronCode 대답 이외에, 당신은 또한 다음을 시도 할 수 있습니다 : 당신이 당신의 유형을 보장 할 수

public interface IDynamicService { 
    void DoSomething(); 
} 

public void static main() { 
    var assembly = Assembly.LoadFrom("filepath"); 
    var aClass = assembly.GetType("NameSpace.AClass"); 
    IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService; 

    if (instance != null) { 
     instance.DoSomething(); 
    } 
} 

이 방법은 특정 구현을해야합니다. 이 클래스가 작동하려면 실제 클래스가 인터페이스를 상속해야하므로 다른 dll 소스 코드에 액세스 할 수 없으면이 방법이 도움이되지 않습니다. 이런 식으로하면 동적 인 클래스가 애플리케이션과 잘 맞는지 항상 Intellisense를 얻을 수 있다는 장점이 있습니다.

3

은 수동으로 어셈블리를로드 한 다음 어셈블리 이름과 클래스 이름을 알고 주어진 클래스의 인스턴스를 만들 수 있습니다.

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass"); 
dynamic instance = Activator.CreateInstance(aClass); 
관련 문제