2011-09-20 1 views
0

지난 주에 DLL (.net DLL)에있는 클래스를 사용하는 것에 대해 친구들과 토론했습니다. 나는 내 Exe에서 그것을 소비해야합니다. NET DLL이 있습니다.EXE에서 DLL 사용

일반적으로는,

  1. 나는 (내 DLL에) 클래스의 객체
  2. 시작 호출 방법/함수를 만듭니다 내 솔루션에 DLL을 추가하고 내 exe는
  3. 에 DLL을 참조 방금 생성 된 객체의 클래스

하지만 마침내 우리는 반사 방식을 우리가하는 방식이 아니라 사용해야한다고 결정했습니다. 원인은 느슨한 커플 링입니다. DLL의 기능을 변경하고 컴파일 할 수 있습니다. 이러한 상황에서는 클라이언트 코드를 컴파일 할 필요가 없습니다.

이 배경으로 질문이 있습니다.

매우 간단한 응용 프로그램 (콘솔 응용 프로그램이라고 말합니다)이 있고 두 클래스 모두 서로 다른 작업을 수행하는 writtern이 있다고 가정합니다. 당신은 클래스 A의 객체를 만들려면 어떻게해야합니까

class Program 
{ 
    static void Main() 
    { 

     //How do you create a object of the class A. 

    } 
} 


class A 
{ 

    string A = "I am from A"; 
    public B b; 
    public A 
    { 
     b = new B(); 

    } 
} 

class B 
{ 

    string B = "I am from B"; 
    public B 
    { 

    } 
    public void Print() 
    { 
     Console.WriteLine(B); 
    } 
}  

때 모든 세 가지 클래스 같은 EXE 및 방법이 동일한 개체를 만들 때 클래스 A와 다른 DLL에서 클래스 B.

질문의 sencond 부분에 대한 하나의 대답은 사용 인터페이스이고 반사를 사용합니다.

리플렉션이 실제로 필요한지 아니면 프로그래밍 표준의 일종입니까?

클래스의 개체를 만드는 가장 좋은 방법은 무엇입니까?

+6

인터페이스 느슨한 결합을 달성하는 올바른 방법입니다. 나는 느슨한 결합하지만 좋은 패턴/방법론은 반사를 사용하여 포함하지 않습니다를 달성하기 위해 반사를 사용하는 방법에 대한 확실하지 않다. –

+1

일반적으로 말하자면 C#에서 *. * 리플렉션을 사용하여 .exe를 다시 컴파일하거나 배포 할 필요가 없습니다. 실제로는 .exe에서 메서드 이름/시그니처/etc를 변경하지 않는 한 리플렉션을 사용하면 어떤 경우에도 다시 컴파일해야합니다. 리플렉션없이 인터페이스를 사용하십시오. –

+1

예, 리플렉션을 사용하여 클래스 라이브러리의 기능을 복제하려고 시도하지 마십시오. –

답변

1

인터페이스는 느슨한 커플 링을 제공합니다.

재 컴파일 또는 재배포하지 않고 팩트 후에 기능을 확장 또는 대체 할 수있는 기능을 제공하려는 경우 기본적으로 느슨한 결합을 기반으로하는 인터페이스 상단에 플러그인 유형 아키텍처가 있습니다.

반향을 사용하여 개체 인스턴스를 만들 수 있지만 다른 옵션은 구성/등록입니다. 예를 들어 설정 파일 (또는 레지스트리 등)에서 해당 인터페이스를 구현하는 파일과 클래스를 가리키고 런타임에 System.Activator를 사용하여이를 만들 수 있습니다.

예 :

http://msdn.microsoft.com/en-us/library/ms972962.aspx

또 다른 더 강력한 옵션은 MEF이다. 그것은 .net 프레임 워크 팀에서 개발 된 플러그인 프레임 워크입니다. 이 링크 밖으로

확인 : 링크에서

http://mef.codeplex.com/

(질문을 reenforcing) :

"응용 프로그램 요구 사항이 자주 변경 및 소프트웨어는 지속적으로 진화하고 그 결과, 이러한 응용 프로그램은 종종이된다. 모 놀리 식이므로 새로운 기능을 추가하기가 어렵습니다 .MEF (Managed Extensibility Framework)는확장 가능한 응용 프로그램 및 구성 요소의 디자인을 단순화하여이 문제를 해결하는 .NET Framework 4 및 Silverlight 4 "

가 도움이되기를 바랍니다.