gpt4 book ai didi

c# - 编写 C# 插件系统

转载 作者:IT王子 更新时间:2023-10-29 04:08:05 25 4
gpt4 key购买 nike

我正在尝试编写一个插件系统来为我的应用程序提供一些可扩展性,以便有人可以在不触及主应用程序代码的情况下为应用程序编写插件(并冒破坏某些东西的风险)。

我已经编写了基本的“IPlugin”接口(interface)(atm,还没有实现)

这是我加载的方式:

public static void Load()
{
// rawr: http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx
String[] pluginFiles = Directory.GetFiles(Plugins.PluginsDirectory, "*.dll");
foreach (var plugin in pluginFiles)
{
Type objType = null;
try
{
//Assembly.GetExecutingAssembly().GetName().Name
MessageBox.Show(Directory.GetCurrentDirectory());
Assembly asm = Assembly.Load(plugin);
if (asm != null)
{
objType = asm.GetType(asm.FullName);
if (objType != null)
{
if (typeof(IPlugin).IsAssignableFrom(objType))
{
MessageBox.Show(Directory.GetCurrentDirectory());
IPlugin ipi = (IPlugin)Activator.CreateInstance(objType);
ipi.Host = Plugins.m_PluginsHost;
ipi.Assembly = asm;
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Unhandled Exception! (Please Report!)", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
}
}
}

一个 friend 试图帮忙,但我真的不明白哪里出了问题。

插件的文件夹结构如下:

\
\插件\

所有插件都在 [root] 目录中引用名为“Lab.Core.dll”的 .dll,但由于加载了重复引用,它不存在于 Plugins 目录中。

插件系统是从我的可执行文件引用的 Lab.Core.dll 加载的。类型“IPlugin”也在 Lab.Core.dll 中。 Lab.Core.dll 正如其名,是我的应用程序的核心。

编辑:

问题:为什么/我遇到的异常是什么?我该如何修复它?

最终编辑:

好的,所以在查看了 friend 为 TF2 调节器编写的一些源代码后,我决定重写它。

这是我得到的并且有效:

    public class TestPlugin : IPlugin {
#region Constructor

public TestPlugin() {
//
}

#endregion

#region IPlugin Members

public String Name {
get {
return "Test Plugin";
}
}

public String Version {
get {
return "1.0.0";
}
}

public String Author {
get {
return "Zack";
}
}

public Boolean OnLoad() {
MessageBox.Show("Loaded!");
return true;
}

public Boolean OnAllLoaded() {
MessageBox.Show("All loaded!");
return true;
}

#endregion
}

public static void Load(String file) {
if (!File.Exists(file) || !file.EndsWith(".dll", true, null))
return;

Assembly asm = null;

try {
asm = Assembly.LoadFile(file);
} catch (Exception) {
// unable to load
return;
}

Type pluginInfo = null;
try {
Type[] types = asm.GetTypes();
Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.GetName().Name.Equals("Lab.Core"));
Type type = core.GetType("Lab.Core.IPlugin");
foreach (var t in types)
if (type.IsAssignableFrom((Type)t)) {
pluginInfo = t;
break;
}

if (pluginInfo != null) {
Object o = Activator.CreateInstance(pluginInfo);
IPlugin plugin = (IPlugin)o;
Plugins.Register(plugin);
}
} catch (Exception) {
}
}

public static void LoadAll() {
String[] files = Directory.GetFiles("./Plugins/", "*.dll");
foreach (var s in files)
Load(Path.Combine(Environment.CurrentDirectory, s));

for (Int32 i = 0; i < Plugins.List.Count; ++i) {
IPlugin p = Plugins.List.ElementAt(i);
try {
if (!p.OnAllLoaded()) {
Plugins.List.RemoveAt(i);
--i;
}
} catch (Exception) {
Plugins.List.RemoveAt(i);
--i;
}
}
}

最佳答案

The Managed Extensibility Framework (MEF) is a new library in .NET that enables greater reuse of applications and components. Using MEF, .NET applications can make the shift from being statically compiled to dynamically composed. If you are building extensible applications, extensible frameworks and application extensions, then MEF is for you.

http://www.codeplex.com/MEF

编辑:CodePlex 即将停用 - 代码已移至 Github 仅供存档:https://github.com/MicrosoftArchive/mef

MEF 现在是 Microsoft .NET Framework 的一部分,类型主要在 System.Composition 下。 namespace 。 MEF有两个版本

  • System.ComponentModel.Composition,它随 .NET 4.0 及更高版本一起提供。这提供了已在 Visual Studio 中使用的标准扩展模型。可以找到此版本 MEF 的文档 here
  • System.Compostion 是 MEF 的轻量级版本,已针对静态组合方案进行了优化并提供更快的组合。它也是 MEF 的唯一版本,它是一个可移植类库,可用于电话、商店、桌面和 Web 应用程序。此版本的 MEF 可通过 NuGet 获得并且文档可用here

关于c# - 编写 C# 插件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1070787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com