本机代码中的托管 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