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

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

但困扰我的是..

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

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

【问题讨论】:

    标签: c++ com language-interoperability


    【解决方案1】:

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

    【讨论】:

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

    【讨论】:

    • 感谢您的回应.....但是启动 clr 本身并没有创建进程吗?
    • @sandeepbisht 不,启动 CLR 不会启动进程。可以以一种相当直接的方式混合本机代码和托管代码。 CLR 启动存在问题(相对较慢),在早期的 CLR 版本中,您不能在同一进程中拥有多个 CLR 版本,但这些问题大多已成为过去。
    猜你喜欢
    • 2016-04-25
    • 2011-10-02
    • 2012-01-29
    • 2014-02-18
    • 2012-10-10
    • 2011-04-09
    • 2011-03-08
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多