gpt4 book ai didi

c# - 通过 C# 中的 COM RCW 对象检测跨线程编码

转载 作者:可可西里 更新时间:2023-11-01 08:43:50 26 4
gpt4 key购买 nike

我正在处理大量 COM 互操作的大型多线程 C# 应用程序中工作。其他开发人员和我有足够的机会不小心调用 Single-Threaded Apartment (STA)来自 MTA 线程的 COM 对象,以及来自它们不是在其上创建的 STA 线程的 COM 对象。性能低下,跨线程编码是主要嫌疑人。

是否有测试跨公寓编码的好方法?更好的是,是否有一种防御性编程技术来测试给定的 COM 对象是否属于该线程的单元?

我最接近的是在可疑代码周围放置一个断言语句:

Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.STA);
suspiciousComInterface.SomeMethod();

虽然这会在我们的 BackgroundWorker 线程调用 STA 对象时发出警告,但我特别担心 STA 线程正在使用在另一个 STA 线程中创建的 COM Runtime Callable Wrapper (RCW) 对象。

一个在线资源表明这是不可能的 (http://www.pcreview.co.uk/forums/detecting-cross-apartment-com-calls-t2450589.html),因为 CLR 掩盖了太多的 COM 代理对象以致于无法在高层访问它们。

我不敢相信这是唯一的答案。谢谢!

最佳答案

您应该能够通过测试是否可以到达 IMarshal 接口(interface)来完成此操作,如果调用是跨公寓调用,则该接口(interface)应该聚合到代理中。首先,您需要在项目的某处声明 IMarshal:

  [System.Runtime.InteropServices.InterfaceTypeAttribute(1)]
[System.Runtime.InteropServices.Guid("00000003-0000-0000-C000-000000000046")]
public interface IMarshal
{
// no methods needed, just querying for the interface
}

然后,您可以像这样测试接口(interface)。

  if (suspiciousComInterface is IMarshal)
// cross-apartment call
else
// direct call

关于c# - 通过 C# 中的 COM RCW 对象检测跨线程编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7252323/

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