2010-10-07 40 views
5

Có ai biết cách xử lý AddIns được tạo bằng System.AddIn hay không. Tất cả các ví dụ trực tuyến dường như cho thấy làm thế nào để dễ dàng tải và sử dụng một addin, nhưng không ai cho thấy làm thế nào để xử lý chúng một khi họ đang sống. Vấn đề của tôi là tôi tạo ra các addins trong các quy trình mới, và các quy trình này không bao giờ bị thu gom rác thải, rõ ràng là một vấn đề.Vứt bỏ AddIns được tạo bằng MAF (System.AddIn)

Dưới đây là một số mã mẫu minh họa sự cố của tôi. Giả sử rằng người dùng không bao giờ thoát khỏi ứng dụng này, nhưng thay vào đó tạo ra nhiều phiên bản của ICalculator. Các quy trình addIn này từng được xử lý như thế nào?

static void Main(string[] args) 
    { 
     string addInRoot = GetExecutingDirectory(); 

     // Update the cache files of the pipeline segments and add-ins 
     string[] warnings = AddInStore.Update(addInRoot); 

     // search for add-ins of type ICalculator 
     Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICalculatorHost), addInRoot); 

     string line = Console.ReadLine(); 
     while (true) 
     { 
      AddInToken calcToken = ChooseCalculator(tokens); 

      AddInProcess addInProcess = new AddInProcess(); 
      ICalculatorHost calc = calcToken.Activate<ICalculatorHost>(addInProcess, AddInSecurityLevel.Internet); 

      // run the add-in 
      RunCalculator(calc);  
     } 
    } 
+0

Oh, một số thông tin thêm. Tôi cũng giữ một tham chiếu đến các xử lý hợp đồng trong lớp HostViewAdapter của tôi, mà vẫn không có vẻ để làm các trick. –

Trả lời

9

Tôi đã tìm được giải pháp cho vấn đề trên, nó đang sử dụng lớp AddInController và phương pháp tắt máy của nó. Bây giờ, để xem liệu tôi có thể làm điều này để làm việc trong đơn đăng ký của tôi, không chỉ ví dụ này:

static void Main(string[] args) 
    { 
     string addInRoot = GetExecutingDirectory(); 
     string[] warnings = AddInStore.Update(addInRoot); 
     Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICalculatorHost), addInRoot); 


     while (true) 
     { 
      AddInToken calcToken = ChooseCalculator(tokens); 

      AddInProcess addInProcess = new AddInProcess(); 
      ICalculatorHost calc = calcToken.Activate<ICalculatorHost>(addInProcess, AddInSecurityLevel.Internet); 

      // run the add-in 
      RunCalculator(calc); 

      // shutdown the add-in when the RunCalculator method finishes executing 
      AddInController controller = AddInController.GetAddInController(calc); 
      controller.Shutdown(); 
     } 
    } 
+2

+1 để báo cáo lại giải pháp của riêng bạn. Rất nhiều trong tinh thần của SO. – spender

+2

Cảm ơn, tôi nghĩ rằng tôi muốn lưu các nhà phát triển đồng nghiệp của tôi những nỗi đau –

+2

"Tôi nghĩ rằng tôi muốn lưu các nhà phát triển đồng nghiệp của tôi đau" - và có rất nhiều đau đớn với System.AddIn .... –

0

giải pháp của bạn không hiệu quả đối với tôi.

Vì bạn đang tạo ra một quy trình mới cho addin của bạn, bạn có thể chỉ đơn giản là

addInProcess.Shutdown(); 

quá trình bên ngoài sẽ tắt máy

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