5

假设我有一个众所周知的接口IWellKnownInterface,它是已知的COM-visible并已注册。

我也有C#,这个对象的托管(确切地说)实现:

public class MyWellKnownClass : IWellKnownInterface { ... }

最后,我有一个extern方法,它接受这个接口的对象:

[Whatever]
private static extern void ExternMethod(IWellKnownInterface veryWellKnown);

问题一:

我想从以下CLR角度了解以下代码下会发生什么:

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

我知道,如果我们谈论的是从托管代码调用非托管 COM 对象,那么一切都是关于构造一个适当Runtime Callable Wrapper的并通过适当的参数转换通过它委托调用。但是,当我们有一个托管 COM 对象并在非托管代码中使用它时,我找不到任何有关这种情况的信息。

问题2:

类型如何dynamic影响CLR相同情况下的行为?它会以某种方式改变内部托管到非托管的互操作逻辑吗?MyWellKnownClass也许为实例添加一些额外的包装器?

dynamic a = new MyWellKnownClass();
ExternMethod(a);
4

1 回答 1

3

问题一:

第一行只创建一个对象。与任何其他 CLR 对象没有什么特别或不同之处。这是因为实际上没有任何东西被封送到非托管代码。

但是,在第二行,创建了一个COM 可调用包装器并将其封送至非托管代码。将此视为运行时可调用包装器的反面,将来自非托管代码的调用处理回您的 COM 接口的托管实现。

问题2:

dynamic类型根本不会影响调用。在这种特殊情况下,您将托管引用传递给非托管代码。的类型a MyWellKnownClass,唯一要做的就是更改在托管代码dynamic中解析对它的调用的方式。创建 COM 可调用包装器时,它具有对 的实例的硬引用,而不是变量;唯一改变的是,当被调用时,被调用方法的解析发生在运行时而不是编译时。MyWellKnownClassdynamicExternMethod

于 2012-10-02T15:04:50.087 回答