2009-06-25 3 views
9

내가 선택한 언어를 사용하여 그래픽 사용자 인터페이스 응용 프로그램을 만들어야합니다. 응용 프로그램은 Windows XP에서 실행됩니다. 그것은 복잡한 윈도우 폼 응용 프로그램의 일종 것입니다. 대부분의 제안에 따라 C#을 사용하는 것이 가장 좋습니다. GUI의 왼쪽에있는 트리 구조는 2 진 파일이 될 구성 파일에서 읽은 후 채워집니다. (하지만 초기에는 간단한 ASCII 파일로 작업하여 코드를 테스트 할 수 있습니다.) 응용 프로그램은이 GUI를 통해 사용자로부터 일부 입력을 받아들이고 같은 구성 파일에 다시 쓰고 트리 구조 나 레이블 또는 양식의 다른 관련 필드에 변경 사항을 반영합니다.C에서 플러그인 기반 응용 프로그램

각 탭마다 3 개의 탭과 3 개의 해당 구성 파일이 있습니다. 지금 당장 응용 프로그램을 설계하는 데 도움이 필요합니다. 호스트 응용 프로그램 (주 응용 프로그램)을 만들고 플러그인으로 3 탭 컨트롤을 사용할 계획입니다. 이게 효과가 있니? 그렇다면이 부분을 안내해주십시오. C#으로 3 가지 플러그인을 만드는 방법과 인터페이스를 작성하여 메인 애플리케이션이 어떤 플러그인을로드할지, 언제로드 할지를 어떻게 알 수 있습니까? 내 프로젝트 폴더 아래에 별도의 "플러그인"폴더가 있습니까? 나는 이것이 당신이 시작할 수있는 정보가 너무 적기는하지만 당신이 나의 요점을 알기를 바랍니다.

또한 프로젝트에 일부 .cpp 파일이 이미 있습니다. 일부 .h 파일과 함께이 파일에는 몇 가지 중요한 정의와 상수가 포함되어 있습니다. 이러한 것들을 C# 응용 프로그램과 통합해야합니다. 나는 그 일을 할 수있는 방법이 없지만 .dll에서 .cpp 코드를 컴파일하고 컴파일 된 .dll을 C# 응용 프로그램에 노출시키는 것이 가능하다고 확신합니다. 최상위 레벨 디자인에 대한 추가 정보가 필요한 경우 알려 주시기 바랍니다.

감사합니다, Viren 내가 사용한 쉬운 플러그인 개념의

+0

"그래픽 사용자 인터페이스 응용 프로그램을 만들어야합니다." "아니오"라고 말하는 용기가 있습니다. – ima

+0

나는 당신을 얻지 못했습니까? – zack

답변

12

수동으로 플러그인 인터페이스를 구현하려면 다음과 같은 메소드가 필요합니다. 일부 TODO를 남겨 두었습니다. 여기서 오류 처리를 향상시키고 구현을 좀 더 구체적인 경우로 지정하려고합니다.

public List<T> LoadPlugin<T>(string directory) 
    { 
     Type interfaceType = typeof(T); 
     List<T> implementations = new List<T>(); 

     //TODO: perform checks to ensure type is valid 

     foreach (var file in System.IO.Directory.GetFiles(directory)) 
     { 
      //TODO: add proper file handling here and limit files to check 
      //try/catch added in place of ensure files are not .dll 
      try 
      { 
       foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes()) 
       { 
        if (interfaceType.IsAssignableFrom(type) && interfaceType != type) 
        { 
         //found class that implements interface 
         //TODO: perform additional checks to ensure any 
         //requirements not specified in interface 
         //ex: ensure type is a class, check for default constructor, etc 
         T instance = (T)Activator.CreateInstance(type); 
         implementations.Add(instance); 
        } 
       } 
      } 
      catch { } 
     } 

     return implementations; 
    } 

예 호출 :

List<IPlugin> plugins = LoadPlugin<IPlugin>(path); 

를 질문의 C++ 부분에 관해서는.올바른 선택은 특정 상황에 따라 다르지만 접근 방법에는 여러 가지가 있습니다. clr 호환 .dll을 C++로 만들 수 있습니다.이 프로젝트는 참조하는 다른 .dll과 마찬가지로 호출 할 수 있습니다. 또한 P/Invoke을 사용하여 기본 .dll을 호출 할 수 있습니다.

+0

덕분에 많이 도움이되었습니다 .. – zack

+0

당신이 찾고 싶지 않았던 기사를 보러 와서 항상 좋은 생각이 들었습니다. 기능, 좋은 출발점! – RobertPitt

8

하나는 확실히 .NET 4 (AFAIK)의 일부가 될 Managed Extensibility Framework했다. 불행히도 아직 완료되지 않았으며 최종 버전과 다를 수있는 미리보기 만 제공됩니다. 즉, 우리는 하나의 프로젝트를 위해 MEF 미리보기 3을 사용했고, 문제없이 작동했고 확실히 전체 플러그인 작업을 훨씬 쉽게 만들었습니다.

+0

확실히 MEF를 사용하면 멋지 네요. –

1

Castle을 살펴보십시오.

+0

감사합니다 .. 캐슬 환상적으로 보이는데 ... 나는 그것을 인식하지 못했습니다 .. – zack

3

봐 : http://msdn.microsoft.com/en-us/library/system.addin.aspx

그렇지 않으면 자신이 모든 것을 할 수 있습니다. 이 네임 스페이스를 사용하기 전에 모든 플러그인/추가 기능을 사용해야하는 공용 인터페이스 인 "IPlugin"을 사용했습니다. 그런 다음 폴더의 모든 * .dll을 검사 한 다음 로더를 사용하여 인터페이스를 확인하는 로더를 사용했습니다. 그런 다음 내 플러그인/추가 인터페이스를 구현 한 클래스의 인스턴스를 만들 수 있습니다.

cpp 파일은 아마도 C#으로 변환해야하거나 참조 할 DLL을 만들 수 있습니다.

관련 문제