通过非托管代码使用托管COM对象

5
假设我有一个众所周知的接口IWellKnownInterface,它是已知的COM-visible并已注册。
我还有这个对象的托管实现(确切地说是C#):
public class MyWellKnownClass : IWellKnownInterface { ... }

最后,我有一个接受该接口对象的外部方法:extern
[Whatever]
private static extern void ExternMethod(IWellKnownInterface veryWellKnown);

问题1:

我想了解下面代码在CLR角度下发生了什么:

IWellKnownInterface a = new MyWellKnownClass();
ExternMethod(a);

我知道,如果我们谈论从托管代码调用非托管COM对象,那么关键在于构建适当的运行时可调用包装并通过它委派调用以进行适当的参数转换。然而,我找不到任何有关情况的信息,当我们有一个托管COM对象并且它被用于非托管代码时。

问题2:

dynamic类型如何影响CLR在相同情况下的行为?它是否会改变内部托管到非托管互操作逻辑?也许为MyWellKnownClass实例添加一些附加的包装器?

dynamic a = new MyWellKnownClass();
ExternMethod(a);
1个回答

3

问题1:

第一行只是创建了一个对象。从任何其他CLR对象发生的事情来看,没有什么特别或不同的地方。这是因为还没有将任何内容实际编组到非托管代码中。

然而,在第二行,创建了一个COM可调用包装器并跨越到非托管代码。可以将其视为运行时可调用包装器的反向操作,处理从非托管代码返回到您的COM接口的托管实现的调用。

问题2:

dynamic类型对调用没有影响。在这种特定情况下,您正在将托管引用传递给非托管代码。 a的类型是MyWellKnownClassdynamic做的唯一的事情是更改在托管代码中解析该调用的方式。当创建COM可调用包装器时,它具有对MyWellKnownClass实例的硬引用,而不是对dynamic变量的引用。唯一发生变化的是,在调用ExternMethod时,所调用方法的解析在运行时而不是在编译时发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接