2012-10-05 6 views
3

정확한 용어를 여기에서 사용하려면 확실하지 않으므로 도움을 받으실 수 있습니다.C에서 플러그 가능한 GUI 및 DLL을 만드는 방법

가장 단순한 양식 응용 프로그램이 있습니다. "form.exe"를로드 할 때 폼에는 하나의 컨트롤 인 메뉴가 있습니다. 이 메뉴에는 하나의 메뉴 항목 "종료"가 있습니다. 내가 원하는 것은 Form이로드 될 때 특수한 메소드, 컨트롤 등을 추가 할 수있는 DLL을 지정하는이 양식 앱에 인수를 전달할 수 있다는 것입니다.

이제 "form.exe add_plugable.dll "내 메뉴에는 또 다른 메뉴 항목 인"추가 "가 있습니다. "form.exe add_plugable.dll remove_pluggable.dll"을로드하면 메뉴에 "종료", "추가"및 "제거"의 3 가지 항목이 있습니다.

희망적입니다. Forms 애플리케이션에 무엇을 포함시켜야하며 DLL을 어떻게 만듭니 까? 나는 공용 인터페이스가 필요하다는 것을 알고 있지만, 네임 스페이스와 인터페이스 및 추상 클래스를 사용하여이를 수행하는 방법을 정확히 모릅니다.

감사합니다.

답변

5

나는 Managed Extensibility Framework을 조사하는 것이 좋습니다. 이 정확한 유형의 시나리오를 위해 설계되었습니다.

예를 들어, Visual Studio에서 확장 성을 위해 사용하는 것이기 때문에 런타임에 추가 기능을 동적으로 검색하고 플러그 인 할 수 있습니다.

+0

VS 2010으로 업그레이드 할 때 이것은 아마도 내 솔루션이 될 것입니다. 그러나 2008 년 현재 .Net 3.5를 사용하고 있습니다. – Tizz

+0

@Tizz CodePlex 사이트에서 다운로드하십시오. .NET 3.5에서 완벽하게 작동합니다. http://mef.codeplex.com/releases/view/40606 –

+0

사실이 튜토리얼도 참조 용으로 추가되었습니다. http://www.c-sharpcorner.com/uploadfile/rmcochran /plug_in_architecture09092007111353am/plug_in_architecture.aspx – Tizz

4

당신은 미리 작성된 프레임 워크를 사용하지만, 당신은 "베어 뼈"솔루션을 찾고 있다면,이 시도 할 수 있습니다 : (당신이 선호하는 경우, 또는 인터페이스 세트) 인터페이스를 만들기

  1. 을 포함 양식 앱이 호출 할 모든 메소드 (예 : IPlugin. 별도의 클래스 라이브러리에 인터페이스를 배치하십시오.
  2. 각 플러그인 DLL에 IPlugin을 구현하는 공용 클래스를 만듭니다.
  3. 양식 앱에서로드 할 플러그인과 언제 호출할지 결정합니다. 이 논리는 전적으로 당신에게 달려 있습니다.

이와 같은 플러그인을로드 한 다음 인터페이스 구성원을 호출하여 원하는 것을 수행하십시오. 요구 사항에 따라 플러그인 파일 및 클래스 이름을 app.config, 데이터베이스에서 읽거나 명명 규칙을 통해 계산할 수 있습니다.

var pluginAssembly = Assembly.Load(pluginFileName); 
var plugin = (IPlugin) pluginAssembly.CreateInstance(pluginClassName); 

이러한 메소드에는 프로세스에 대한 제어를 허용하는 몇 가지 오버로드가 있습니다. 예를 들어 간단한 문자열이 아닌 AssemblyName을 사용하여 플러그인 어셈블리를로드 할 수 있습니다. 클래스를 인스턴스화 할 때 클래스의 생성자에 전달할 바인딩 플래그와 매개 변수 값 집합을 지정할 수 있습니다.

+0

도움이됩니다. 이 일을 한 번 이상 투표 할 수 있기를 바랍니다. – dotNET

+0

질문이 하나 있습니다. 이를 통해 새로운 DLL ('IPlugin'을 구현 한 클래스 포함)을 응용 프로그램 디렉토리에 드롭하고 내 응용 프로그램이 다음로드시이를 자동으로 발견 할 수있게 할 수 있습니까? 나중에 새로운 플러그인 DLL이 디렉토리에 추가 될 것이므로 위에서 언급 한'pluginClassName' 매개 변수에 대한 값이 없습니다. 이 문제를 해결하는 방법?그리고 특정 DLL에'IPlugin'을 구현하는 클래스가 있는지 어떻게 알 수 있습니까? – dotNET

+0

'Assembly.Load'는 DLL이 처음 호출되었을 때만 DLL을 검색하므로, DLL을로드하기 전에 언제든지 해당 DLL을 디렉토리에 놓을 수 있습니다. 일단로드되면 어셈블리는 AppDomain의 수명 동안 메모리에 캐시됩니다. 캐시를 새로 고치려면 AppDomain을 재활용하십시오. –