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

本文关键字:dll exe 程序集 运行 AppDomain | 更新日期: 2023-09-27 18:05:35

在写这个问题:AppDomain,处理异常时,我还想到了一个不同的问题。

如果你想写一个像我上面写的插件应用程序。你会把插件写成可执行文件还是库?

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

我目前有一个接口,它的特点是启动/运行+停止+ Init方法后调用CreateInstanceAndUnwrap。您是否对执行的程序集版本具有相同类型的控制?如果我要使用后者,我怎么能实现这样的功能来动态停止插件?

还是我想错方向了?

[edit-after-question]

基本上我们得到了"一个"应用程序和多个功能。

  • 刻录(视频)DVD
  • 打印照片的
  • 从照片/摄像机下载图像
  • 一个POS
  • 存储服务器,功能为备份/配置/图像+视频库
  • 在多个显示器上显示所述照片/视频
  • 和其他一些,但这些是主要的'功能'

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

一切都通过套接字进行通信

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

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

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

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

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

同样,当使用CreateInstanceAndUnwrap()时,如果你有一个很好的理由,没有什么可以阻止你使用exe。

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

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

我目前有一个界面,其中功能的开始/运行+停止+ Init方法

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

一切都通过套接字进行通信

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

  1. 从其他插件中隔离崩溃。插件<<li>启动/停止/gh>
  2. 在崩溃时重新启动插件
  3. 通过电子邮件通知管理员关于崩溃
  4. 汽车更新

你可以简单地利用已经存在的东西——windows服务。如果您将插件部署为windows服务,那么您已经实现了1、2和3。你不必担心AppDomains、本机代码崩溃等问题。该实现是健壮的、经过测试的,并且被管理员很好地理解。您可以通过编程方式管理windows服务。您唯一需要做的就是编写一个'WatchDog'服务,它将发送电子邮件并处理自动更新。