2011-08-15 65 views
3

在写这个问题时:AppDomain, handling the exceptions我也想到了一个不同的问题。AppDomain,运行程序集.exe或.dll?

如果你想写一个像我上面写的插件应用程序。你会去编写插件作为可执行文件或库?

对于通过AppDomain.ExecuteAssembly(String)方法运行的动态加载的可执行文件,您将拥有多少控制权?而不是使用AppDomain.CreateInstanceAndUnwrap(String, String)创建对象的实例。

我现在有一个接口,其特点是在CreateInstanceAndUnwrap之后调用的启动/运行+停止+初始化方法。你对执行的程序集版本有相同的控制类型吗?如果我使用后者,我如何实现这种功能来动态地停止该插件?

或者我在完全错误的方向思考?

[编辑后的问题]

Basicly我们得到了 '一个' 应用程序,以及多种功能。

  • 刻录(视频)DVD)
  • 打印照片的
  • 下载从照片/视频摄像机图像
  • 一个POS
  • 存储服务器,充当备份/ configsettings /图片+视频 知识库
  • 在多台显示器上显示上述照片/视频
  • 等等,但这些是主要的“功能”

计算机可以运行多个任务/插件。例如,我们可以选择让一台电脑处理整个图像下载/显示/打印系统。或者有一台具有多个下载/显示系统的集中式打印机。

一切都是通信的插座

如果重新启动,不管什么原因,它需要一个插件崩溃和邮件要发送到办公室。如果同一次崩溃在短时间内多次发生,那么它应该发送某种紧急电子邮件并关闭该插件并通知操作员。

其中一些函数使用第三方非托管代码,一些使用C++/Native编写,一些使用C++编写,其他一些使用C#编写,所有这些都将在不同项目的相同解决方案中编写。

edit2 还有这个额外的功能,我们想添加到系统中。只要该插件的更新版本可用,就会自动更新插件。父AppDomain /线程应定期检查更新,如果发现更新,应该卸载该插件,下载新版本并重新启动。由于这个特定的原因,我认为我们需要使用AppDomain的

+0

IIRC .NET EXE文件是一个带有引导程序(C++)和清单的.NET DLL,它告诉引导程序入口点的位置,其中包括“使用管理员权限运行我” – Aren

+0

这完全取决于什么这个'插件'需要做。要多照顾一下我们? –

+0

我在您的请求中添加了额外的信息,@ csharptest.net –

回答

2

我肯定会去使用CreateInstanceAndUnwrap()。你有更多的控制方式,你可以合理地与插件进行通信。当你使用ExecuteAssembly()时,你几乎可以启动它,然后读取返回值(一个int)。

另外,当使用CreateInstanceAndUnwrap()时,如果您有充分的理由这样做,没有任何东西阻止您使用exe。

基本上,你有一个工作解决方案,没有必要改变它(至少不是这个方向)。

+0

我已经添加了额外的信息。目前它确实是一个可行的解决方案(我们还没有编写关于插件的任何内容,目前处于规划和设计阶段) –

0

您还应该考虑替代设计。基于这样的信息:

如果我现在有其特点是开始/运行+停止 + Init方法

接口...

一台计算机可以运行多任务/插件。例如,我们可以选择 让一台电脑处理整个图像下载/显示/打印系统。或者有一台带有多个 下载/显示系统的集中式打印机。

...

一切都是通信的插座

通信已经被插座做的,唯一缺少的功能是“管理”:

  1. 隔离在一个插件从崩溃其他。
  2. 启动/停止插件
  3. 重新启动上崩溃
  4. 插件通过电子邮件通知有关崩溃管理员
  5. 自动更新

您可以简单地使用什么已经在那里 - 窗口服务。如果您将插件部署为Windows服务,则已经实现了1,2和3。您不必担心AppDomain,在本机代码崩溃等。该实施是健壮的,经过测试和管理员很好理解。您可以manage windows services programaticaly。您唯一需要做的就是编写一个'WatchDog'服务,它将发送电子邮件并处理自动更新。

+0

但是,这具有GUI的问题。 Windows服务不能由GUI组成。 –

+0

@Daan:是的,在这种情况下,您可能需要一个将其任务卸载到服务的门户GUI应用程序。这可能会成为这种架构的一个破坏者,这取决于复杂性。或者您可以使用常规流程并在WatchDog中管理它们。 – Dmitry