托管CLR:如何设置默认AppDomain的基目录?

时间:2014-11-08 00:35:07

标签: c# .net plugins .net-assembly assembly-resolution

如果我在我的C ++可执行文件中托管CLR,是否有任何方法将默认AppDomain的基目录设置为可执行文件位置以外的其他内容?

这就是我需要它的原因。我有一个相当复杂的应用程序,使用插件加载器可执行文件PluginBox.exe加载.NET插件。插件位于主应用程序文件夹之外。我们为每个插件运行一个PluginBox.exe实例。

目前PluginBox.exe是用C ++编写的。我想将其转换为托管应用。 PluginBox使用非托管CLR托管(ICLRMetaHostICLRRuntimeInfo等),并通过实现IHostAssemblyStore接口来定位插件程序集。只有一个AppDomain,其基本目录是应用程序目录。搜索程序集时,CLR会在查看应用程序基目录之前调用程序集存储。因此,如果插件和主应用程序包含具有相同名称的程序集,则程序集存储可以加载特定于插件的版本。

作为管理PluginBox.exe的第一步,我想摆脱装配商店并用装配解析器替换它。问题是,与程序集存储区不同,程序集解析程序在之后被称为应用程序基目录。因此,如果插件和主应用程序包含具有相同名称的程序集,则主应用程序的程序集将获胜。这会中断插件的执行。

我想将托管CLR的基目录切换到插件所在的位置。到目前为止,我发现只有两种方法可以做到这一点,它们都不可接受:将PluginBox.exe移动到插件目录,或创建第二个AppDomain,由于各种内部原因这是有问题的。这是一个有着悠久历史的巨大应用,任何激烈的举动都必然会引发问题。

感谢任何想法和想法。

PS。目前的CLR版本是4.0。

0 个答案:

没有答案