Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# COM组件的别名注册以允许并发调用_C#_.net_Visual Studio 2010_Com_Registry - Fatal编程技术网

C# COM组件的别名注册以允许并发调用

C# COM组件的别名注册以允许并发调用,c#,.net,visual-studio-2010,com,registry,C#,.net,Visual Studio 2010,Com,Registry,我需要使用一个不能更改的COM库。 公寓状态为STA,未经重构无法切换到MTA 它有两种方法 方法一是一种短期操作 方法二是一项长期运行的操作 我希望能够调用方法一,即使方法二正在进行。 我考虑过的一种方法是复制和更改COM组件的实际二进制文件,并将其注册为一个完全不同的COM组件,然后使用这个别名库的一个实例调用方法二,这样主实例只负责调用方法一 我试着在一个十六进制编辑器中打开DLL并替换ProgID和ClsId,但这似乎不起作用。我知道的注册表项看起来不错,但当我在visual stu

我需要使用一个不能更改的COM库。 公寓状态为STA,未经重构无法切换到MTA

它有两种方法

  • 方法一是一种短期操作
  • 方法二是一项长期运行的操作
我希望能够调用方法一,即使方法二正在进行。 我考虑过的一种方法是复制和更改COM组件的实际二进制文件,并将其注册为一个完全不同的COM组件,然后使用这个别名库的一个实例调用方法二,这样主实例只负责调用方法一

我试着在一个十六进制编辑器中打开DLL并替换ProgID和ClsId,但这似乎不起作用。我知道的注册表项看起来不错,但当我在visual studio中添加引用以生成互操作程序集时,生成的库仍然具有旧的ClsId,并且调用方法1仍然会阻塞,直到方法2完成

有什么办法可以让这一切顺利进行吗?

这种方法完全是误入歧途还是正确的?

创建两个STA线程来处理对组件的调用确实允许我进行并发调用

这里的解决方案实际上比我最初所说的疯狂要简单得多。我以前考虑过这个解决方案,但我想我已经尝试过了,但没有成功。我以前的实现一定有问题

具体来说,我有两个STA线程,我在其中实例化COM组件,然后通过阻塞集合将调用请求传递给这些线程。发出请求对象中指定的调用,并向请求对象提供响应,这些响应向调用线程发出调用已完成的信号


@IgorTandetnik向我指出了这个方向。

如果COM组件要求您使用STA,那么这意味着您无法在执行“2”时调用“方法1”。因为唯一可能的方法是使用线程。组件明确不支持的。请与组件的所有者或供应商联系以获取建议。您不能简单地创建两个线程,让两个线程都加入STA,然后让每个线程创建组件的一个实例吗?是什么让你认为你需要两个不同的CLSID来实现这一点?@HansPassant就这个问题而言,只需接受COM组件无法更改,并且在这方面没有什么可以做的。@IgorTandetnik我尝试设置两个单独的STA线程,但它似乎不起作用。我将重新讨论这种方法——也许我在某个地方搞砸了,根本没有做对。为了回答这个问题,请接受COM组件不允许您这样做。这个限制像石头一样坚硬,你必须和原程序员一起工作才能消除它。不要抱太大希望,你有一个强烈的“不”。你可能会得到一个“是的”,除了那个程序员,没有其他地方可以得到它。