可以一个抽象的类被用来作为合同对象之间的一个'Host'和'插件?这个想法是,插件继承的合同(我们称它为一个适配器)。我们还理解,即所有参加者的框架,必须继承 MarshalByRefObject (MBRO).所以,这是我们思考-

主机:

class Host : MarshalByRefObject
{
}

合同:

public abstract class PluginAdapter : MarshalByRefObject
{
}

插件:

class myPlugin : PluginAdapter
{
}

所有三个存在单独的个体和小型的。我们将创建一个新的程序域的每个插件,并PluginAdapter是创造如下:

{
    ObjectHandle instHandle = Activator.CreateInstance(
    newDomain, data.Assembly.FullName, data.EntryPoint.FullName);

    PluginAdapter adapter = (PluginAdapter)instHandle.Unwrap();
}

编辑:哪里 data 是的具体类型的 myPlugin.

我们想知道,如果这个框架执行情况会的工作。我们已经看到条款使用一个接口(IPlugin)插件导,并具体类为合同。这些文章还说,一个抽象的级可以使用,但没有这方面的例子实施给予。是它所需合同的具体类?

编辑:在这个例子,由理查德*凯特-布莱维特- C#反射 -他用一种更简单的执行情况:

合同:

public interface IPlugIn  
{  
    // do stuff  
}

插件:

public class PlugIn : MarshalByRefObject, IPlugIn  
{  
}

现在,如果使用一个抽象的类合同,插件不能继承这两种合同和MBRO.什么,然后,就成为最好的实现对于一个可扩展的插件的框架。我们应该继续前进,并实施远程处理即使最初,我们正在发展单机操作?该项目预计将成为分布在网络,有可能在互联网上。我们只是还没有实现Tcp因为我们正试图得到基本的插件框架内充分理解和运作。

它是有意义的实施Tcp远程处理上一个机器使用的环回?

有帮助吗?

解决方案

抽象的类是更好的选择,对于这一点,恕我直言。它主要是因为接口更难版本。 这篇文章 描述了这个问题你可能会发现自己具有下来的道路如果你不使用基础课程。这个规则不仅适用于插件,顺便说一句.

有关你的设计...

插件不应该扩展MBRO.你应该用你的主持(它应该延伸MBRO)到马绍尔所有的电话给你的插件,包括处理插件的事件。它非常易于无意中负载一个插件DLL到您主要程序域如果你试图把它们全和使用他们的代理。

例如,如果插件返回一个综合的方法,它可能会返回一个执行情况的综合定义中插件组件。如果不延长MBRO的主要域将必须载的插件组件。


我上传的三项目的处理应用程序域:

http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/Public/NET%20AppDomain%20Tests/appdomaintests.zip

一种是使用回调跨应用程序域,第二是截域事件处理,而第三是一个插件的例子。

在插件,例如,应用程序,定义了一个插件接口(其演示,不最佳做法!) 和一个插件的主机。该应用程序载荷的一个插件装配原始从磁盘和传递过来插域通过的插件的主机的代理,它被装载。插件的主机,然后实例化的插件,并使用它。但是,当东道返回式定义中插会回到应用程序域,插件组件装载入主要的应用领域,使整个插件事情毫无意义的。

最好的事来避免这是提供一个抽象的基类的插件,是没有标明序列化并不延伸MBRO,以及只带回元或密封类型的定义回跨越边界的插件域。

注: 该项目的所有4.0RC。你会需要这个或以上才能运行它们。否则,你将不得不编辑的项目文件方面或者重建他们得到他们运行在b2或2008年。

其他提示

"提供数据。入口点.FullName"是完整的类型中的名称,上述代码应工作。

但是,如果你想保持这种类型孤立在其自己的程序域,你应该小心这里。通过这样做 data.Assembly, 你会把大会(以及这类)进入你域,造成这种被装载在执行程序域...

你可能想看一看 农林部(管理Addin框架) 这是一个扩展的框架内建成的。净做外接程序.它是相似(以上)比 MEF(管理的扩展框架), 但有更多的选择,尽可持的插件在他们自己的应用程序域,除其他事项。

如果 data.EntryPoint.FullName 指的是具体类型 myPlugin 我看不出有任何理由为什么这个不工作(除非有装载问题的其他程序域,但这是一个不同的问题)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top