gpt4 book ai didi

c# - COM 互操作是否尊重程序集加载的 .NET AppDomain 边界?

转载 作者:太空狗 更新时间:2023-10-29 18:13:02 24 4
gpt4 key购买 nike

这是核心问题:我有一个使用 COM interop 的 .NET 应用程序在一个单独的 AppDomain 中。 COM 东西似乎正在将程序集加载回默认域,而不是从中调用 COM 东西的 AppDomain。

我想知道的是:这是预期的行为,还是我做错了什么导致这些与 COM 相关的程序集加载到错误的 AppDomain 中?请在下面查看更详细的情况描述...

该应用程序由 3 个程序集组成:- 主 EXE,应用程序的入口点。- common.dll,仅包含一个接口(interface) IController(IPlugin 样式)- controller.dll,包含实现 IController 和 MarshalByRefObject 的 Controller 类。此类完成所有工作并使用 COM 互操作与另一个应用程序交互。

主 EXE 的相关部分如下所示:

AppDomain controller_domain = AppDomain.CreateDomain("Controller Domain");
IController c = (IController)controller_domain.CreateInstanceFromAndUnwrap("controller.dll", "MyNamespace.Controller");
result = c.Run();
AppDomain.Unload(controller_domain);

common.dll 只包含这两个东西:

public enum ControllerRunResult{FatalError, Finished, NonFatalError, NotRun}
public interface IController
{
ControllerRunResult Run();
}

并且 controller.dll 包含这个类(它也调用 COM 互操作的东西):

public class Controller: IController, MarshalByRefObject

当第一次运行应用程序时,Assembly.GetAssemblies() 看起来像预期的那样,common.dll 被加载到两个 AppDomains 中,而 controller.dll 只被加载到 Controller 域中。但是,在调用 c.Run() 之后,我发现与 COM 互操作相关的程序集已加载到默认的 AppDomain 中,而不是在发生 COM 互操作的 AppDomain 中。

为什么会发生这种情况?

如果您有兴趣,这里有一些背景知识:

最初这是一个 1 AppDomain 应用程序。与它交互的 COM 东西是一个服务器 API,它在长期使用时不稳定。当 COM 异常(没有关于其原因的有用诊断信息)发生时,整个应用程序必须重新启动,COM 连接才能再次工作。简单地重新连接到 COM 应用程序服务器会再次立即导致 COM 异常。为了解决这个问题,我尝试将 COM 互操作的东西移动到一个单独的 AppDomain 中,这样当神秘的 COMExceptions 发生时,我可以卸载它出现的 AppDomain,创建一个新的并重新开始,所有这些都无需手动重新启动应用程序.无论如何,这就是理论......

最佳答案

不幸的是,COM 组件是在进程空间中加载的,而不是在 AppDomain 的上下文中。因此,您将需要手动拆除(释放和卸载)您的 native DLL(适用于 COM 和 P/Invoke)。简单地销毁一个 appdomain 对你没有好处,但重生整个过程不应该是重置 COM 状态所必需的(简单地重新创建 COM 对象也应该正常工作,这听起来像是组件提供程序代码中的错误,也许他们可以解决这个问题吗?)

引用资料

(TechNet) Process Address Space

(MSDN) Application Domains

(MSDN) Boundaries: Processes and AppDomains

关于c# - COM 互操作是否尊重程序集加载的 .NET AppDomain 边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com