gpt4 book ai didi

Windows Server 2012 中的 C# 动态 COM

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:15 25 4
gpt4 key购买 nike

遇到我在 c# 中使用 COM 类型的问题

    this.rtwbType = Type.GetTypeFromProgID(progId, true);
this.rtwb = Activator.CreateInstance(this.rtwbType);

然后我正在做一些事情,当我完成后,我在 rtwb 上调用 exit - 这样它就可以关闭,然后调用:

    Marshal.ReleaseComObject(this.rtwb);

在 2008 R2 中,这很好而且花花公子 - 但我们以 2012 年为例,此处抛出异常。

System.Runtime.InteropServices.COMException (0x800706BA): RPC 服务器不可用。 (HRESULT 异常:0x800706BA)

就像我说的在其他地方工作得很好。

有什么建议吗?

最佳答案

以下代码重现此错误(至少在 Windows 8.1 下):

var type = Type.GetTypeFromProgID("InternetExplorer.Application", true);
dynamic ie = Activator.CreateInstance(type);

ie.Quit(); // this disconnects the COM proxy from the out-of-proc IE object

Marshal.ReleaseComObject(ie); // throws

显然,ReleaseComObject 的实现在处理 COM 代理对象时比调用 IUnknown::Release 做的更多。我的猜测是,它可能正在调用 IRemUnknown::RemRelease ,它返回带有错误的 HRESULT,因此 ReleaseComObject 抛出,因为进程外对象已经断开连接并用 ie.Quit()< 销毁.

据推测,这种行为是在 Windows Server 2012 中引入的。

您可能做的最好的事情就是忽略这个特定错误:

try
{
Marshal.ReleaseComObject(ie);
}
catch (COMException ex)
{
// I'm getting 0x80010108, rather than 0x800706BA
// The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED)

if ((uint)ex.ErrorCode != 0x80010108)
throw;
}

更新:这是像 Quit 这样的 API 的预期行为,它不违反任何 COM 规则。 Quit 的目标是提供一个用于显式关闭的 API。我相信它使用 CoDisconnectObject在内部,作为关闭过程的一部分。这会断开所有外部代理引用,因此服务器知道它可以安全关闭。

事实上 ReleaseComObject 在那之后仍在尝试做一些事情(比如,很可能,在断开连接的代理上调用 IUnknown::QueryInterface)并不是错误COM 服务器。

关于Windows Server 2012 中的 C# 动态 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176807/

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