我目前正在修改插件架构,以便它利用 AppDomains。我的插件与我在网上找到的许多示例之间的主要区别在于,不是插件运行并将其结果发送回主应用程序,而是我的主应用程序是向插件发送信息的一个。
就目前而言,我在单独的 AppDomain 中创建了加载程序的实例。然后它会执行所有正常初始化,例如加载插件程序集。至此,我然后使用加载器的代理来调用将数据从主应用程序发送到新 AppDomain 的方法。
当我尝试调用具有不可序列化的参数类型且不是从 MarshalByRefObject 派生的方法时,就会出现我的问题。
由于这些类型来自 3rd 方代码,并且插件希望接收它们,因此我似乎找不到这样做的方法。在找到这个问题(如何用像 C# 这样的良好但多继承截断语言解决“必须是 MarshalByRefObject”?)后,我正在考虑创建某种包装器。我的缺点是我根本无法找到一种方法来制作一个不修改第 3 方代码的方法。
这是我的问题的一个例子:
// Cant modify this class
class ThirdPartyClass
{
// The properties are also 3rd party and nonserializable. These are accessed by the plugins.
public AnotherClass Property1{ get; set; }
public AnotherClass Property2{ get; set; }
public ThirdPartyClass(){}
}
class Loader : MarshalByRefObject
{
private Plugin plugin;
public Loader()
{
Assembly pluginAssembly = Assembly.LoadFrom("Full/Assembly/Path");
plugin = pluginAssembly.CreateInstance("Full.Plugin.Name") as Plugin;
}
public void DoSomething(ThirdPartyClass o)
{
...
plugin.DoSomethingElse(o);
}
}
class PluginManager
{
void Main(ThirdPartyClass o)
{
AppDomain pluginAppDomain = AppDomain.CreateDomain("Plugin AppDomain");
Loader loader = pluginAppDomain.CreateInstanceFromAndUnwrap("Full/Loader/Path", "Full.Loader.Name") as Loader;
// This is where I would have a problem.
loader.DoSomething(o);
}
}
任何帮助将不胜感激。