Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 托管CLR:如何设置默认AppDomain的基本目录? < >强>如果在我的C++可执行文件中托管CLR,有没有办法将默认AppDe域的基础目录设置为可执行文件的位置以外的其他东西?< /强> < /P>_C#_.net_Plugins_.net Assembly_Assembly Resolution - Fatal编程技术网

C# 托管CLR:如何设置默认AppDomain的基本目录? < >强>如果在我的C++可执行文件中托管CLR,有没有办法将默认AppDe域的基础目录设置为可执行文件的位置以外的其他东西?< /强> < /P>

C# 托管CLR:如何设置默认AppDomain的基本目录? < >强>如果在我的C++可执行文件中托管CLR,有没有办法将默认AppDe域的基础目录设置为可执行文件的位置以外的其他东西?< /强> < /P>,c#,.net,plugins,.net-assembly,assembly-resolution,C#,.net,Plugins,.net Assembly,Assembly Resolution,这就是为什么我需要它。我有一个相当复杂的应用程序,它使用插件加载程序可执行文件,PluginBox.exe加载.NET插件。插件位于主应用程序文件夹之外。我们为每个插件运行一个PluginBox.exe实例 当前的代码>插件框.exe < /C> >用C++编写。我想将其转换为托管应用程序PluginBox使用非托管CLR宿主(ICLRMetaHost、ICLRRuntimeInfo等),并通过实现IHostAssemblyStore接口来定位插件程序集。只有一个AppDomain,其基本目录是

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

当前的代码>插件框.exe < /C> >用C++编写。我想将其转换为托管应用程序

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

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


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

感谢您的任何想法和想法


PS.当前CLR版本为4.0。

作为一种解决方法,您可以将所有程序集移动到主应用程序的单独目录中,并对这些程序使用解析器。“或者创建第二个
AppDomain
,这是由于各种内部原因造成的问题”。好吧,拥有自定义AppDomain的惯用方法是实例化自定义AppDomain。你能详细解释一下为什么你不能这样做吗?@Jester-是的,我想过了。不会飞-应用程序的其他部分使用这些程序集。请参阅“历史悠久的大型应用程序”部分。如果这里唯一的问题是您对默认域的程序集解析不满意,那么您可以挂接到
AssemblyResolve
事件以获得更细粒度的控制。这样你就可以查看任何你想找到插件的文件夹。@Asad:第二个应用程序域不好的原因。插件使用一些非托管thunk代码与主机通信。如果我创建第二个应用程序域,我将立即遇到非托管回调问题。我也可以用C#重写thunk代码,但这是一个更大、更危险的变化。我可能在以后的某个时候尝试一下。第二个原因——表现。第三个原因:我已经托管了CLR:我希望我可以控制它,而不是增加虚拟实体。