我加载的插件必须加载到左侧的列表框中,并且必须加载它们而不使用文件扩展名。
所以
“FirstPlugin.dll”
将加载为
“FirstPlugin”
这是背后的代码:
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)
{
//Calls OpenFile Method
OpenFile();
}
private void OpenFile()
{
_Plugins = new Dictionary<string, IPlugin>();
ICollection<IPlugin> listbox = GenericPluginLoader<IPlugin>.LoadPlugins("Plugins");
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.GetFileNameWithoutExtension(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));
//foreach (var item in listbox)
//{
// //add only if not already present
// if (!_Plugins.ContainsKey(item.Name))
// {
// string dllName = GetDLLName(item.Name);
// ListBox lbName= new ListBox()
// {
// Name = dllName.Replace(".", "").ToUpper(),
// };
// //lbFiles.Items.Add(item.Name);
// PluginGrid.Children.Add(lbName);
// _Plugins.Add(item.Name, item);
// // this.PluginGrid.Children.Clear();
// //by Vasey
// }
//}
//Calls CopyToDir method and copies dll's to Plugin Folder
CopyToDir(filename);
}
}
private void CopyToDir(string filename)
{
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.GetFileNameWithoutExtension(asm.Location);
}
return ret;
}
private void lbFiles_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
AssembleComponents(sender);
}
private void ClearBtn_Click(object sender, RoutedEventArgs e)
{
try
{
// Clears the ListBox
lbFiles.Items.Clear();
//Clears the Assembly
this.PluginGrid.Children.Clear();
//Loads next Assembly
_Plugins = new Dictionary<string, IPlugin>();
}
catch
{
System.Windows.MessageBox.Show("No Items to Clear");
}
}
private void RemoveSelectedItem_Click(object sender, RoutedEventArgs e)
{
try
{
lbFiles.Items.RemoveAt(lbFiles.SelectedIndex);
}
catch
{
System.Windows.MessageBox.Show("No Items to Remove");
}
}
}
}
如何将文件名放入列表框并在没有扩展名的情况下工作?
答案 0 :(得分:5)
您应该使用Path.GetFileNameWithoutExtension()
方法,例如
result = Path.GetFileNameWithoutExtension(fileName);
看起来你已经收到了它,但在列表框中添加了错误
lbFiles.Items.Add(System.IO.Path.GetFileName(filename));
更改
var ext = System.IO.Path.GetFileNameWithoutExtension(filename);
lbFiles.Items.Add(ext);