2012-06-11 29 views
9

tôi làm việc với MEF và tôi đang tìm cách thay đổi địa chỉ của các vị trí của các plugin bằng các phương tiện khác mà MEF tìm các plugin, tôi muốn thay đổi dòng nàyMEF Plugin tải từ thư mục

Assembly.LoadFrom(@"C:\julia\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll"))); 

Tôi muốn xóa url này bởi vì tôi cần để triển khai ứng dụng của tôi trong một máy

Đây là chức năng của tôi:

public void AssembleCalculatorComponents() 
{ 
    try 
    { 
     //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
     //var container = new CompositionContainer(catalog); 
     //container.ComposeParts(this); 
     var catalog = new AggregateCatalog(); 

     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFrom(@"C:\yosra\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll"))); 
     var container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

bạn có thể vui lòng giúp tôi?

Cảm ơn

+8

Là một lưu ý phụ: bạn không nên sử dụng 'throw ex; 'trong khối catch của bạn (điều này" phá hủy "dấu vết ngăn xếp, tức là bạn sẽ không thể thực sự biết vị trí ngoại lệ thực sự đã xảy ra). Nếu bạn muốn ném lại ngoại lệ, chỉ cần sử dụng 'throw; '(không chỉ định lại ngoại lệ) - hoặc chỉ ** không ** bắt ngoại lệ nếu bạn không làm gì cả! –

Trả lời

5

Xin chào một lần nữa và nhờ trả lời của bạn, vì vậy vấn đề của tôi là để nạp plugin trực tiếp, vì vậy tôi tạo ra một thư mục và tôi đặt plugin của tôi trong thư mục này, vì vậy tôi tìm thấy giải pháp này

public void AssembleCalculatorComponents() 
     { 


      string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 
      Console.WriteLine(path); 
      //Check the directory exists 
      if (!Directory.Exists(path)) 
      { 
       Directory.CreateDirectory(path); 
      } 
      Console.WriteLine(path); 
      string assemblyName = Assembly.GetEntryAssembly().FullName; 
      Console.WriteLine(assemblyName); 
      //Create an assembly catalog of the assemblies with exports 
      var catalog = new AggregateCatalog(
       new AssemblyCatalog(Assembly.GetExecutingAssembly().Location), 
       new AssemblyCatalog(Assembly.Load(assemblyName)), 
       new DirectoryCatalog(path, "*.dll")); 

      //Create a composition container 
      var container = new CompositionContainer(catalog); 
      container.ComposeParts(this); 

đây là Giải pháp của tôi, suy nghĩ cho tất cả

2

Hai tùy chọn.

  1. Sử dụng thư mục hiện tại làm thư mục gốc cho plugin của bạn. Environment.CurrentDirectory sẽ chỉ cho bạn đi đúng hướng.
  2. Sử dụng một app.config để chỉ định một thư mục cho các plugins của bạn được lưu trữ trong.
16

Bạn có thể sử dụng lớp DirectoryCatalog có MEF quét một thư mục cụ thể cho hội đáp ứng nhập khẩu của bạn.

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(".")); 
var container = new CompositionContainer(catalog); 

Ở trên sẽ thêm thư mục cơ sở mà AppDomain sử dụng để định vị hội đồng (thường là thư mục chứa tệp thi hành trừ khi được thay đổi với cấu hình) vào danh mục tổng hợp. Bạn cũng có thể muốn thêm assembly hiện hành, mặc dù nó không được yêu cầu.

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
catalog.Catalogs.Add(new DirectoryCatalog(".")); 
var container = new CompositionContainer(catalog); 

Thông tin thêm về MSDN cho DirectoryCatalog: http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting.directorycatalog.aspx

+0

Cảm ơn bạn đã trả lời, tôi thay đổi mã này 'var catalog = new AggregateCatalog(); catalog.Catalogs.Add (AssemblyCatalog mới (Assembly.GetExecutingAssembly())); catalog.Catalogs.Add (new DirectoryCatalog (@ "./ plugins")); var container = new CompositionContainer (catalogue); nhưng không hoạt động với tôi, bạn có thể giải thích thêm cho tôi không – julia

1

Nếu phương pháp của bạn biết của loại được khởi tạo, bạn có thể sử dụng Assembly tài sản của Type mà là điển hình cho * Tên miền của tôi * thư viện; nếu không, bạn có thể sử dụng Assembly.GetExecutingAssembly(). Tôi không đặc biệt thích GetExecutingAssembly() hoặc GetCallingAssembly() ...:

public void AssembleCalculatorComponents() { 
    try { 
     var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
    // OR 
     asmCatalog = new AssemblyCatalog(typeof(TObject).Assembly); // replace TObject with object's actual type 
     var aggregateCatalog = new AggregateCatalog(asmCatalog); 
     // 
     AddDirectoryCatalogs(aggregateCatalog.Catalogs)); 
     var container = new CompositionContainer(catalog); 

     // assuming this class has the member(s) to be composed. 
     container.ComposeParts(this); 
    } catch (Exception ex) { 
     throw ex; 
    } 
    } 

Bên cạnh đó, bạn có thể thêm DirectoryCatalogs - hoặc bởi app.config tập tin, danh sách tuần tự các thư mục, vv Bắt đầu tắt, tuy nhiên, bạn có thể chỉ định một thư mục mặc định trong số app.config của bạn - đó là những gì tôi đề xuất. Sau đó, giả sử bạn đang sử dụng Settings:

private readonly Settings settings = Settings.Default; 

void AddDirectoryCatalogs(ICollection<ComposablePartCatalog> Catalogs agrCatalogs) { 
    agrCatalogs.Add(new DirectoryCatalog(settings.DefaultPath, settings.DefaultPattern)); 
    // add more directory catalogs 
} 

Trong khi sử dụng "." như con đường tìm kiếm là một shortcut hợp pháp vào thư mục lắp ráp thực hiện của, hãy nhớ rằng tất cả các cụm sẽ được tìm kiếm cho các bộ phận thực hiện - tức là, phù hợp với Import/Export đối tượng. Sử dụng các mẫu cụ thể là đề xuất của tôi. Ví dụ của Microsoft không được biết đến là thực tiễn tốt nhất. Nếu bạn mong đợi bất kỳ plugin nào được thêm hậu tố Plugin.dll, hãy tạo một phần của mẫu tìm kiếm của bạn.

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