AppDomain,运行程序集 .exe 或 .dll?

3
在撰写这个问题的时候:AppDomain, handling the exceptions,我也想到了一个不同的问题。
如果你要编写像我上面写的插件应用程序,你会将插件编写为可执行文件还是库?
如果使用AppDomain.ExecuteAssembly(String)方法运行动态加载的可执行文件而不是使用AppDomain.CreateInstanceAndUnwrap(String, String)创建对象实例,你会有多少控制权?
我现在有一个接口,其中包含一个在CreateInstanceAndUnwrap之后调用的Start/Run + Stop + Init方法。你对执行的程序集版本是否具有相同类型的控制?如果我使用后者,如何实现停止该插件的功能?
还是我的思路完全错误?
[编辑 - 问题后]
基本上,我们有“一个”应用程序和多个功能。
烧录(视频)DVD
打印照片
从照相/摄像机下载图像
销售点
存储服务器,作为备份/配置设置/图像+视频存储库
在多个显示器上显示上述照片/视频
还有其他一些,但这些是主要的“功能”。
计算机可以运行多个任务/插件。例如,我们可以选择让一台计算机处理整个图像下载/显示/打印系统。或者有一台集中的打印计算机,带有多个下载/显示系统。
所有内容都通过套接字进行通信。
如果插件因任何原因崩溃,它需要重新启动,并向办公室发送邮件。如果在短时间内发生同样的崩溃,则应发送某种紧急电子邮件并关闭该插件并通知操作员。
其中一些功能使用第三方未管理的代码,有些是用C++ / Native编写的,有些是用C++ / CLI编写的,还有一些是用C#编写的,所有这些都将被编写为不同的项目在同一个解决方案中。
编辑2
我们还想向系统添加此附加功能。即在插件有新版本可用时自动更新插件。父AppDomain /线程应定期检查更新,如果发现更新,则应卸载该插件,下载新版本并重新启动。出于这个特定的原因,我认为我们需要使用AppDomain。

如果我没记错的话,.NET Exe 文件是一个带有引导程序(C++)和清单的 .NET DLL,其中清单告诉引导程序入口点在哪里,以及其他一些内容,比如“使用管理员权限运行我”。 - Aren
这完全取决于这个“插件”需要做什么。能否再多给我们一些信息? - csharptest.net
我已根据你的要求添加了额外的信息,@csharptest.net。 - Daan Timmer
2个回答

2
我肯定会选择使用CreateInstanceAndUnwrap()。这样您就可以更好地控制并与插件进行通信。当您使用ExecuteAssembly()时,您基本上只能启动它,然后读取返回值(一个int)。

此外,当使用CreateInstanceAndUnwrap()时,如果您有充分的理由,仍然可以使用exe。

总之,您已经有了一个可行的解决方案,没有必要改变它(至少不是朝这个方向)。


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

0

您还应考虑备选设计。基于此信息:

我目前拥有一个界面,其中包括Start/Run + Stop + Init方法

...

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

...

所有通信均通过套接字进行

通信已经通过套接字完成,唯一缺少的功能是“管理”:

  1. 将一个插件的崩溃与其他插件隔离开来。
  2. 启动/停止插件
  3. 在崩溃时重新启动插件
  4. 通过电子邮件通知管理员崩溃情况
  5. 自动更新

您可以简单地利用已经存在的Windows服务。如果您将插件部署为Windows服务,则已经实现了1、2和3。您不必担心AppDomains、本机代码中的崩溃等问题。该实现是强大、经过测试并且被管理员充分理解。您可以以编程方式管理Windows服务。您唯一需要做的就是编写一个“看门狗”服务,它将发送电子邮件并处理自动更新。


但这涉及到 GUI 的问题。Windows 服务不能包含 GUI。 - Daan Timmer
@Daan:是的,在这种情况下,您可能需要一个门户GUI应用程序,它将把其任务卸载到服务中。这取决于复杂性,这可能会成为此架构的破坏者。或者您可以使用常规进程并在WatchDog中管理它们。 - Dmitry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接