本机代码中的托管 dll(通过 com)。它是在进程中还是在进程 com 服务器中?

Posted

技术标签:

【中文标题】本机代码中的托管 dll(通过 com)。它是在进程中还是在进程 com 服务器中?【英文标题】:managed dll in native code (via com) .is it in process or out process com server? 【发布时间】:2013-10-07 07:39:25 【问题描述】:

我需要在我的本机代码 (c++) 中使用托管动态链接库 (c#)。我找到了解决方案 就在这里。 (http://support.microsoft.com/kb/828736)。

但困扰我的是..

1) 在本机代码中使用的托管动态链接库是否通过 com 充当进程 com 服务器? .如果是的话怎么可能?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

"...COM 知道它需要从相应的 .NET 程序集中 P/Invoke 函数。"--它本身证明必须创建新进程 ..加载 clr 和 stuf.. .--->>> 进程外 @sandeepbisht:不,您可以将 CLR 加载到完全相同的进程中。 您认为托管程序如何调用 Windows API?他们在同一个地址空间中这样做 - inproc。这种情况与那个情况相反。【参考方案2】:
    COM 知道如何为托管 DLL 启动 CLR,因此这适用于可以在适当位数(即,AnyCPU 或 32/64 位)下运行的托管 DLL。 对于跨位 DLL,我相信 CLR 知道如何启动 DllHost.exe 并在进程外运行托管 DLL。当然会慢一些。

【讨论】:

感谢您的回应.....但是启动 clr 本身并没有创建进程吗? @sandeepbisht 不,启动 CLR 不会启动进程。可以以一种相当直接的方式混合本机代码和托管代码。 CLR 启动存在问题(相对较慢),在早期的 CLR 版本中,您不能在同一进程中拥有多个 CLR 版本,但这些问题大多已成为过去。

以上是关于本机代码中的托管 dll(通过 com)。它是在进程中还是在进程 com 服务器中?的主要内容,如果未能解决你的问题,请参考以下文章

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

使用包含托管类的 /CLR 标志构建的本机 dll

尽管启用了本机代码调试,但是仍无法从托管调试本机代码

在 Visual Studio 2015 中调试本机应用程序加载的托管 DLL

尽管启用了本机代码调试,但仍无法从托管调试本机代码

从 Nuget 包中自动提取本机和托管 DLL