2009-06-25 39 views
9

Tôi phải tạo một ứng dụng giao diện người dùng đồ họa bằng ngôn ngữ mà tôi chọn. Ứng dụng sẽ chạy trên Windows XP. Nó sẽ là một loại ứng dụng biểu mẫu cửa sổ phức tạp. Tôi nghĩ và theo hầu hết các đề xuất, C# sẽ là cách tốt nhất để sử dụng. Cấu trúc cây ở bên trái GUI sẽ cư trú sau khi đọc từ tệp cấu hình sẽ là tệp nhị phân. (nhưng ban đầu tôi có thể làm việc với một tệp ASCII đơn giản để kiểm tra mã của tôi.). Ứng dụng sẽ chấp nhận một số đầu vào từ người dùng thông qua GUI này và sẽ ghi lại cho cùng một tệp cấu hình và sẽ phản ánh những thay đổi trong cấu trúc cây hoặc nhãn hoặc bất kỳ trường liên quan nào khác trên biểu mẫu.Ứng dụng dựa trên plugin trong C#

Sẽ có 3 tab và 3 tệp cấu hình tương ứng cho từng tab. Tôi cần trợ giúp thiết kế ứng dụng ngay bây giờ. Tôi đang lập kế hoạch để tạo một ứng dụng máy chủ (ứng dụng chính) và sử dụng các điều khiển 3 tab làm plugin. Điều này có khả thi không? Nếu vậy bạn có thể hướng dẫn tôi về điều này. Tôi có nghĩa là làm thế nào để tôi thực hiện 3 plugins trong C# và làm thế nào để tôi viết các giao diện để các ứng dụng chính biết được plugin để tải và khi nào để tải nó? Sẽ có một thư mục "Plugin" riêng biệt trong thư mục dự án của tôi không? Tôi hy vọng bạn có quan điểm của tôi mặc dù đây là quá ít thông tin để bạn bắt đầu.

Cũng có một số tệp .cpp đã có trong dự án. Các tệp này cùng với một số tệp .h chứa một số định nghĩa và hằng số quan trọng trong chúng. Chúng cần được tích hợp với ứng dụng C# của tôi. Tôi không có đầu mối làm thế nào để làm điều đó nhưng tôi chắc chắn rằng nó có thể bằng cách biên dịch mã .cpp trong một .dll và sau đó phơi bày các .dll biên dịch để ứng dụng C# của tôi. Vui lòng cho tôi biết nếu bạn cần thêm thông tin cho thiết kế cấp cao nhất.

Cảm ơn, Viren

+0

"Tôi phải tạo một ứng dụng giao diện người dùng đồ họa" Có can đảm để nói "Không" – ima

+0

tôi không nhận được bạn? – zack

Trả lời

12

Để triển khai giao diện plugin theo cách thủ công, bạn sẽ cần phương thức như thế này. Tôi đã để lại một số TODO, nơi bạn sẽ muốn tăng cường xử lý lỗi và/hoặc thực hiện việc triển khai thêm một trường hợp cụ thể hơn một chút.

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; 
    } 

Ví dụ để gọi:

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

Đối với C++ một phần của câu hỏi của bạn.Có vài cách khác nhau bạn có thể tiếp cận điều này, mặc dù lựa chọn chính xác tùy thuộc vào tình huống cụ thể của bạn. Bạn có thể thực hiện một clr compliant .dll trong C++, mà dự án C# của bạn có thể tham chiếu và gọi giống như bất kỳ tài liệu tham khảo nào khác mà nó tham chiếu. Ngoài ra, bạn có thể sử dụng P/Invoke để gọi vào một tệp .dll gốc.

+0

cảm ơn rất nhiều.this thực sự giúp .. – zack

+0

Luôn luôn tốt đẹp để đi qua một bài báo mà bạn không tìm kiếm và suy nghĩ, tôi nên thực hiện như vậy tính năng, điểm khởi đầu tuyệt vời! – RobertPitt

8

Một trong những khái niệm Plugin đơn giản nhất mà tôi đã từng được sử dụng là chắc chắn Managed Extensibility Framework đó sẽ là một phần của .NET 4 (afaik). Thật không may nó chưa được hoàn thành và chỉ có một bản xem trước có sẵn mà có thể khác với phiên bản cuối cùng. Điều đó đang được nói, chúng tôi sử dụng MEF Preview 3 cho một dự án uni và nó làm việc mà không có vấn đề và nó chắc chắn làm cho toàn bộ công cụ plugin dễ dàng hơn nhiều.

+0

Chắc chắn sử dụng MEF thật tuyệt vời. –

1

Hãy xem Castle.

+0

thanks..castle dường như tuyệt vời .. tôi đã không nhận thức được nó .. – zack

3

Nhìn vào namespace System.Addin: http://msdn.microsoft.com/en-us/library/system.addin.aspx

Nếu không, bạn có thể làm tất cả mọi thứ cho mình. Trước khi không gian tên này có sẵn, tôi đã sử dụng một giao diện chung "IPlugin" mà mọi plugin/addin cần sử dụng. Sau đó tôi đã có một bộ nạp mà kiểm tra tất cả các * .dll trong một thư mục sau đó được sử dụng phản ánh để kiểm tra giao diện. Sau đó tôi có thể tạo các thể hiện của các lớp đã triển khai giao diện plugin/addin của tôi

Tệp cpp có thể sẽ cần chuyển đổi thành C# hoặc bạn có thể tạo dll để tham chiếu.

Các vấn đề liên quan