Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ 本机代码中的托管dll(通过com)。是进程内还是进程外com服务器?_C++_Com_Language Interoperability - Fatal编程技术网

C++ 本机代码中的托管dll(通过com)。是进程内还是进程外com服务器?

C++ 本机代码中的托管dll(通过com)。是进程内还是进程外com服务器?,c++,com,language-interoperability,C++,Com,Language Interoperability,我需要在本机代码(c++)中使用托管动态链接库(c#)。我找到了解决方案 就在这里。 (). 但困扰我的是 1) 托管动态链接库是否通过com作为进程内com服务器在本机代码中使用。如果是,怎么可能 2) 如果否,那么动态链接库如何在不由可执行文件执行的情况下充当进程外com服务器。这是进程内配置。这并不比直接使用P/Invoke机制更“不可能”。运行regasm时,它会对注册表进行必要的更改,以便当客户端调用CoCreateInstance()COM时,它知道它需要从相应的.NET程序集中P

我需要在本机代码(c++)中使用托管动态链接库(c#)。我找到了解决方案 就在这里。 ().

但困扰我的是

1) 托管动态链接库是否通过com作为进程内com服务器在本机代码中使用。如果是,怎么可能


2) 如果否,那么动态链接库如何在不由可执行文件执行的情况下充当进程外com服务器。

这是进程内配置。这并不比直接使用P/Invoke机制更“不可能”。运行
regasm
时,它会对注册表进行必要的更改,以便当客户端调用
CoCreateInstance()
COM时,它知道它需要从相应的.NET程序集中P/Invoke函数

  • COM知道如何为托管DLL启动CLR,因此这对于可以以适当位运行的托管DLL(即任意CPU或32/64位,视情况而定)有效
  • 对于交叉位DLL,我相信CLR知道如何启动DllHost.exe并在进程外运行托管DLL。当然会慢一些

  • “…COM知道它需要从相应的.NET程序集中P/调用函数。”--它本身证明必须创建新进程..从中加载clr和stuf…-->>process@sandeepbisht:不,您可以将CLR加载到完全相同的进程中。没问题。您认为托管程序如何调用Windows API?它们在同一个地址空间(inproc)中执行此操作。此场景与您的响应的1.thx相反……但启动clr本身并不是在创建进程吗?@sandeepbisht不,启动clr不会启动进程。可以以相当简单的方式混合本机代码和托管代码。CLR启动存在问题(速度相对较慢),在早期的CLR版本中,不能在同一个过程中有多个CLR版本,但这些问题大多是过去的事情。