【问题标题】:C# Load DLL FailsC# 加载 DLL 失败
【发布时间】:2020-09-07 19:23:47
【问题描述】:

我正在用 C# 编写一个插件系统。

int Length = Directory.GetFiles(@".\Plugins", "*.dll").Length;
foreach (var file in Directory.GetFiles(@".\Plugins", "*.dll"))
{
    string PluginDLL = Directory.GetCurrentDirectory() + file;
    Assembly asm = Assembly.LoadFrom(PluginDLL);
    
    foreach (var type in asm.GetTypes())
    {
        if (type.GetInterfaces().Contains(typeof(IMyPlugin)))
        {
            IMyPlugin plugin = Activator.CreateInstance(type) as IMyPlugin;
            
            if (!plugins.Any(item => item.PluginName == plugin.PluginName) && 
                !plugins.Any(item => item.PluginVersion == plugin.PluginVersion))
            {
                plugins.Add(plugin);

                ToolStripMenuItem pluginToolStripeItem = new System.Windows.Forms.ToolStripMenuItem();
                pluginToolStripeItem.Name = plugin.PluginName + "ToolStripMenuItem";
                pluginToolStripeItem.Text = plugin.PluginName;
                ansichtToolStripMenuItem.DropDownItems.Add(pluginToolStripeItem);
                //this.startseiteToolStripMenuItem.Click += new System.EventHandler(this.StartseiteToolStripMenuItem_Click_1);
            }
        }
    }
}

所以第一个 .dll 加载成功。 当涉及到第二个 .dll 时,PluginDirectory 设置成功, 但是“asm”仍然是第一个 .dll 中的那个

为什么我用新的 PluginDirectory 调用时 asm 没有改变。

我希望你能帮助我。

最好的问候 斯蒂芬·K

【问题讨论】:

标签: c# dll plugins


【解决方案1】:

我现在解决了这个问题。我首先生成一个程序集列表,然后遍历该列表。我不知道为什么当我创建实例时它不起作用,...直接在我获取程序集的 foreach 中。

这就是现在的解决方案。

List<Assembly> allAssemblies = new List<Assembly>();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Plugins\\";

foreach (string dll in Directory.GetFiles(path, "*.dll"))
    allAssemblies.Add(Assembly.LoadFile(dll));

foreach (Assembly asm in allAssemblies)
{
    try
    {
        foreach (Type type in asm.GetTypes())
        {
            if (type.GetInterfaces().Contains(typeof(IMyPlugin)))
            {
                IMyPlugin plugin = Activator.CreateInstance(type) as IMyPlugin;
                string[] pathParts = asm.Location.Split('\\');
                int pathLenght = pathParts.Length;
                plugin.PluginLoadedPath = pathParts[pathLenght-1];

                if (!CurrentPlugins.Any(item => item.PluginName == plugin.PluginName) && !CurrentPlugins.Any(item => item.PluginVersion == plugin.PluginVersion))
                {
                    CurrentPlugins.Add(plugin);
                    ToolStripMenuItem pluginToolStripeItem = new System.Windows.Forms.ToolStripMenuItem();
                    pluginToolStripeItem.Name = plugin.PluginName + "ToolStripMenuItem";
                    pluginToolStripeItem.Text = plugin.PluginName;
                    ansichtToolStripMenuItem.DropDownItems.Add(pluginToolStripeItem);
                    //this.startseiteToolStripMenuItem.Click += new System.EventHandler(this.StartseiteToolStripMenuItem_Click_1);
                }
            }
        }
    }
    catch
    { }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2012-12-21
    • 2012-12-29
    • 2020-09-01
    • 2019-07-10
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多