【发布时间】:2020-11-28 01:38:12
【问题描述】:
我认为托管和非托管 STA 代码之间存在 COM 互操作问题,我认为这是由于尝试从错误线程调用 COM 对象所致。
有没有办法在 STA 设置中真正告诉 COM 对象“属于”哪个线程/单元?我在 C++ 或 C# 中都找不到方法,但两者都有用!
是否有 API 可以做到这一点?
【问题讨论】:
-
公寓类型(基本上是 STA 与 MTA)是通过调用 CoInitialize(Ex) 定义的。通常是调用此 API 的线程创建者,这在 .NET 中通常是隐式的(或基于属性的,如 STAThreadAttribute)。只有一个 MTA。您可以确定线程所在的公寓的类型(GetApartmentState)。现在,在此线程执行期间创建的每个对象都将存在于该单元中(如果线程是 STA,则为 MTA 或 STA)。
-
@SimonMourier 是的,这就是我的观点,在 STA 中我怎么知道是哪一个?从错误的线程调用 COM 对象很容易——C++ 似乎允许你,它甚至可以工作。所以检查会很方便。
-
AFAIK 没有这样的 api,但如果您控制对象的创建时间以及在哪个线程上创建,则不需要它。
-
此外,在 C# 中,如果您从错误的线程调用 STA COM-server,.net 将在内部将此调用分派到正确的 STA 线程,然后将调用的结果分派回调用者线程。因此,在 C# 中,从任何线程调用 COM 都是合法的(但您仍然需要注意防止 STA 线程锁定)。