2013-12-19 27 views
1

我需要使用一个COM库来更改CANT。 Apartment State是STA,无需重构即可切换到MTA。针对COM组件的别名注册允许并发调用

它有两种方法

  • 方法一是一个短期操作
  • 方法二是一个长期运行的操作

我希望能够拨打电话到方法一即使方法二正在进行中。 一种方法,我认为是复制和改变COM组件的实际二进制和注册为一个完全不同的COM组件,然后使用这个alias'd库的一个实例来调用做方法二使主实例只负责拨打方法一

我已经尝试只是一个十六进制编辑器打开了DLL和更换的ProgID和CLSID,但似乎并不奏效。该注册表项,我所知道的样子没错,但是当我为了我的生成interop程序添加在Visual Studio中引用,生成的库仍然有旧的CLSID,并呼吁方法一仍然阻塞,直到方法二完成。

关于如何使这项工作的任何想法?
这种做法是完全错误的,还是我在正确的轨道上?

+0

如果COM组件需要您使用STA,那么这意味着当“two”正在执行时您不能调用“方法一”。因为唯一可能的方法就是使用线程。该组件明确不支持该组件。联系组件的所有者或供应商以获得建议。 –

+3

难道你不能简单地创建两个线程,都加入STA,并有每个创建组件的实例?是什么让你觉得你需要两个不同的CLSID? –

+0

@HansPassant为了这个问题的目的,只是接受COM组件不能被改变,并且没有什么可以做的。 –

回答

0

创建两个STA线程来处理调用的组件肯定让我做并发呼叫。

这里的解决方案实际上比我最初说的是疯狂的方式简单。之前我曾考虑过这个解决方案,但是我以为我试过了,它没有奏效。我之前的实施一定是错误的。

具体来说,我有两个STA线程中,我在我的实例化COM组件,然后我通过阻断收集通过调用请求这些线程。请求对象中指定的调用已完成,并向请求对象提供响应,这些响应表示调用线程已完成调用。

@IgorTandetnik指出我在这个方向。