2016-07-06 11 views
0

dllを開いてクリックすると、クリック可能なアイテムとしてリストボックスにロードできるようになりました。プラグインがロードされ、そのプラグインを実行できます。私はプラグインをリロードするとき、それが重複しないように、私はあまりにもアセンブリをクリアするにはどうすればよいロードされたアセンブリをクリアして、プラグインをリロードしたときに重複しないようにするにはどうすればいいですか?

I added a clear button that is suppose to clear the app of the currently loaded plugins.

It clears everything off the app but when I go to load them again, it loads duplicates.

?背後に

コード:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using PluginContracts; 
using System; 
using System.IO; 
using Microsoft.Win32; 
using System.ComponentModel.Composition; 
using System.ComponentModel.Composition.Hosting; 
using System.Reflection; 
using System.Diagnostics; 
using System.Linq; 

namespace SimplePlugin 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 

    public partial class MainWindow : Window 
    { 

     Dictionary<string, IPlugin> _Plugins; // move to class scope 


     public MainWindow() 
     { 
      InitializeComponent(); 
      _Plugins = new Dictionary<string, IPlugin>(); 

     } 

     private void AssembleComponents(object sender) 
     { 


      string selection = ""; 
      if (sender is ListBox) 
      { 
       if (((ListBox)sender).SelectedValue != null) 
        selection = ((ListBox)sender).SelectedValue.ToString(); 
      } 

      string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 
      DirectoryCatalog cat = new DirectoryCatalog(path); 

      //ICollection<IPlugin> plugins = PluginLoader.LoadPlugins("Plugins"); 
      ICollection<IPlugin> plugins = GenericPluginLoader<IPlugin>.LoadPlugins("Plugins"); 



      foreach (var item in plugins) 
      { 
       //add only if not already present 
       if (!_Plugins.ContainsKey(item.Name)) 
       { 
        string dllName = GetDLLName(item.Name); 

        Button b = new Button() 
        { 
         Name = dllName.Replace(".", "").ToUpper(), 
         Content = item.Name, 
         Visibility = System.Windows.Visibility.Hidden 
        }; 

        b.Click += b_Click; 
        PluginGrid.Children.Add(b); 

        _Plugins.Add(item.Name, item); 



        // this.PluginGrid.Children.Clear(); 
        //by Vasey 

       } 
      } 


      // make visible the selected plugin button 
    foreach (var ctl in PluginGrid.Children) 
    { 
     if (ctl is Button) 
     { 
      Button button = (Button)ctl; 

      if (button.Name.Equals(selection.Replace(".", "").ToUpper())) 
      { 

       button.Visibility = System.Windows.Visibility.Visible; 
      } 
      else 
      { 
       button.Visibility = System.Windows.Visibility.Hidden; 
      } 
     } 
    } 
     } 


     private void b_Click(object sender, RoutedEventArgs e) 
     { 
      Button b = sender as Button; 
      if (b != null) 
      { 
       string key = b.Content.ToString(); 
       if (_Plugins.ContainsKey(key)) 
       { 
        IPlugin plugin = _Plugins[key]; 
        plugin.Do(); 
       } 
      } 
     } 

     private void addPlugin_Click(object sender, RoutedEventArgs e) 
     { 

      var fileDialog = new OpenFileDialog(); 

      fileDialog.Multiselect = true; 
      fileDialog.Filter = "All files (*.*)|*.*|DLL files (*.dll)|*.dll|CS Files (*.cs)|*.cs"; 

      if (fileDialog.ShowDialog() == true) 
      { 
       string filename = fileDialog.FileName; 
       var ext = System.IO.Path.GetExtension(filename); 

       // ListBox lbFiles = new ListBox(); 

       //this.Controls.Add(lbFiles); 
       //lbFiles.Size = new System.Drawing.Size(200, 100); 
       //lbFiles.Location = new System.Drawing.Point(10, 10); 

       lbFiles.Items.Add(System.IO.Path.GetFileName(filename)); 
       // 

       CopyToDir(filename); 
      } 
     } 

     private void CopyToDir(string filename) 
     { 
      // txtBox.Text = "Hello World"; 
      string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 
      Console.WriteLine(path); 
      //Check the directory exists 
      if (!Directory.Exists(path)) 
      { 
       Directory.CreateDirectory(path); 
      } 

      try 
      { 
       FileInfo fi = new FileInfo(filename); 
       if (!File.Exists(System.IO.Path.Combine(path, fi.Name))) 
       { 
        File.Copy(fi.FullName, System.IO.Path.Combine(path, fi.Name)); 
       } 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

     // Get linkage between ListBox's DLL name list and the loaded plugin names 
     string GetDLLName(string name) 
     { 
      string ret = ""; 

      name = name.Replace(" ", ""); // strip spaces 

      Assembly asm = AppDomain.CurrentDomain.GetAssemblies(). 
        SingleOrDefault(assembly => assembly.GetName().Name == name); 

      if (asm != null) 
      { 
       ret = Path.GetFileName(asm.Location); 
      } 

      return ret; 
     } 


     private void lbFiles_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      AssembleComponents(sender); 

     } 

     private void ClearBtn_Click(object sender, RoutedEventArgs e) 
     { 

      lbFiles.Items.Clear();  
      _Plugins = new Dictionary<string, IPlugin>(); 

     } 
    } 
} 
+2

ロードされたdllをアンロードすることを意味しますか?はいの場合、GenericLoaderを変更してdllを分離したAppDomainにロードし、PluginオブジェクトをMarshellingするまではできませんでした。 –

答えて

0

私はちょうど

private void ClearBtn_Click(object sender, RoutedEventArgs e) 
    { 

     // Clears the ListBox 
     lbFiles.Items.Clear(); 

     //Clears the Assembly 
     this.PluginGrid.Children.Clear(); 

     //Loads next Assembly 
     _Plugins = new Dictionary<string, IPlugin>(); 

    } 

private void ClearBtn_Click(object sender, RoutedEventArgs e) 
      { 

       lbFiles.Items.Clear();  
       _Plugins = new Dictionary<string, IPlugin>(); 

      } 

前clearBtn方法

//Clears the Assembly 
     this.PluginGrid.Children.Clear(); 

にこの機能を追加する必要がありました

関連する問題