【问题标题】:WPF Prism - Manage Modules In ApplicationWPF Prism - 管理应用程序中的模块
【发布时间】:2012-10-15 14:54:31
【问题描述】:

将 Prism 与 WPF 结合使用,我希望允许用户从存储库中选择他们想要使用的模块。每个模块本质上都是一个附加组件,选择要使用的模块只需将其移动到 DLL 的“模块”文件夹中即可加载。

但是,在应用程序运行时尝试移动 DLL,会引发错误,因为此时 DLL 正在使用中。您如何解决这个问题并允许用户随意添加/删除模块?

【问题讨论】:

  • 您使用的是 Unity 还是 MEF。您需要使用 MEF 来允许动态加载模块。 danielvg.dk/post/2010/02/13/Unity-vs-MEF-vs-PRISM.aspx .... forums.silverlight.net/t/227834.aspx/1
  • 我正在使用 Unity,此时我正在成功地从文件夹中动态加载。很多人说只有MEF可以做到这一点,这是不正确的,至少就发现模块而言。我想更具体地说,我想看看我是否可以在运行时卸载模块(以便可以更新/删除 DLL)。使用 MEF 而不是 Unity 是否可以做到这一点?
  • 一旦程序集被加载到 AppDomain 中,它不会被卸载,直到 AppDomain 被拆除......我想这是你的问题。如果你在网上看,有一些技术可以解决这个问题......例如创建一个额外的 AppDomain,然后您可以关闭它......但是您必须使用 MarshalByRef 在 AppDomains 之间编组调用。 stackoverflow.com/questions/6578170/…
  • 这是有道理的。谢谢您的意见。我想我找到了解决方法,至少允许用户“添加/删除”模块。我只是在引导程序之前启动的登录屏幕上添加了一个“配置模块”选项。这将在加载之前根据需要从文件夹中复制/删除模块。另外,你想把它放在回复中以便我可以将其标记为答案吗?

标签: wpf prism


【解决方案1】:

一旦将程序集加载到 AppDomain 中,它就不会(不能)被卸载,直到 AppDomain 被拆除......我想这是你的问题。

如果您在网上查看,有一些技巧可以解决这个问题.....

创建一个额外的 AppDomain

创建一个额外的AppDomain,然后您可以将程序集加载到其中......完成后,您只需调用Unload 以关闭AppDomain,这将释放程序集。

但是,您希望从其他 AppDomains 可以访问的类型必须从 MarshalByRefObject 派生,以便您的对象是可远程的......并且可以编组来自其他 AppDomain 的调用。

将程序集加载到 MemoryStream 中

这里有一个非常有趣的技术......它首先将程序集加载到MemoryStream,然后让.NET从MemoryStream加载程序集......这意味着磁盘上的“文件”是'未锁定。

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多