Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net COM可调用包装器与哪个单元关联?_.net_Com_Com Interop - Fatal编程技术网

.net COM可调用包装器与哪个单元关联?

.net COM可调用包装器与哪个单元关联?,.net,com,com-interop,.net,Com,Com Interop,我已经读了很多关于COM公寓和.NET互操作的书,但是我还没有找到这个问题的答案。这让我相信我可能问错了问题 我知道.NET线程和本机线程一样可以是MTA或STA,我找到了关于这方面的文档,但我很少看到关于对象及其CCW如何与这些单元关联的内容 我的猜测是CCW的线程模型是“两者”,CCW与创建线程所属的单元相关联 哪个单元是与CCW相关联的,我能控制这种行为吗?.NET实现的COM对象通常可以存在于任何类型的COM单元中。默认情况下,用于将.NET程序集注册为COM服务器的.NET方法/工具将

我已经读了很多关于COM公寓和.NET互操作的书,但是我还没有找到这个问题的答案。这让我相信我可能问错了问题

我知道.NET线程和本机线程一样可以是MTA或STA,我找到了关于这方面的文档,但我很少看到关于对象及其CCW如何与这些单元关联的内容

我的猜测是CCW的线程模型是“两者”,CCW与创建线程所属的单元相关联


哪个单元是与CCW相关联的,我能控制这种行为吗?

.NET实现的COM对象通常可以存在于任何类型的COM单元中。默认情况下,用于将.NET程序集注册为COM服务器的.NET方法/工具将使用threading model=
Both
注册CoClass


如果您想将.NET类公开为具有不同线程模型的COM类(例如,强制进入STA),那么您需要提供一个。

我明白了,但是对于未由CoCreateInstance实例化的对象呢?例如,如果COM客户端调用x.CreateWidget,并且该方法的实现返回一个新的.NET对象。返回小部件的CCW会继承x的CCW单元吗?这是一个非常好的问题。在默认情况下(threading model=Both),答案是显而易见的——正常的COM规则将把新对象放在其创建者(x)的单元中。但是,我不知道在创建新的COM包装以返回到非托管客户机时,互操作层是否尊重自定义注册:例如,当小部件注册为单元线程(反之亦然)时,x是否为两者。你可以试试看。