我在我目前正在修改一个插件架构,使其利用应用程序域。 我在网上找到我的插件和许多例子之间的主要区别在于不是插件运行并发送其结果返回给主应用程序,我的主要应用是一个将信息发送到该插件。
当前标准的,我在一个单独的AppDomain创建加载器实例。 那么它所有的正常初始化,例如加载插件组装。 由于这一点,然后我用装载机的代理来调用从主应用到新的AppDomain中发送数据的方法。
当我尝试调用它有一个参数类型不是可序列化的方法,并且不从MarshalByRefObject的派生出现我的问题。
由于这些类型是从第三方代码,插件指望得到他们,我似乎无法找到一个办法做到这一点。 发现这个问题后( 如何解决“必须是MarshalByRefObject的”如C#?一个好的,但多重继承截肢语言 ),我在想创造某种包装的。 在这里,我的缺点是,我只是不能想出一个办法让一个没有修改第三方代码。
这是我的问题的例子:
// 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);
}
}
任何帮助将不胜感激。