在不同的线程上运行COM接口

时间:2017-12-28 13:54:05

标签: c# multithreading com

我正在为提供COM接口IPlugin的应用程序编写库插件。我必须实现函数Start(),因为该应用程序通过ProgID调用我的库并在那里提供接口实例。

简短的使用样本:

[ComVisible(true)]
[Guid({GUID})]
[ClassInterface(ClassInterfaceType.None)]
public class Program : IPlugin
{
    [STAThread]
    public void Start(IInterface myInterface)
    {
        var a = myInterface.GetValue();
    }
}

当我在主线程中使用界面时,一切都很顺利。

但是,当我想在其他线程中使用该接口时,我会遇到异常:

无法将“System .__ ComObject”类型的COM对象转换为接口类型“IInterface”。此操作失败,因为对于具有IID“{GUID}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口

我尝试了“保存”接口到GlobalInterfaceTable并在其他线程上“加载”它,尝试了CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream,尝试了来自this SO源和许多其他人的解决方案,总是得到相同的错误(使用“已保存”和“加载“相同线程上的接口仍然可以,所以我认为,我正在使用它。”

也许我被误解了一些东西,我无法在这里尝试解决它。​​

我正在尝试这么久,但我没有解决方案。

如果还有更多的事情可以尝试,我很乐意解决这个问题。

0 个答案:

没有答案