使用非托管代码中的托管COM对象

时间:2012-10-02 14:35:02

标签: c# .net com interop clr

假设我有一个众所周知的界面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对象,那就是构建一个合适的Runtime Callable Wrapper并通过适当的参数转换委托调用它。但是,当我们有一个托管的COM对象并且它在非托管代码中使用时,我找不到有关这种情况的任何信息。

问题2:

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

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

1 个答案:

答案 0 :(得分:3)

问题1:

第一行除了创建一个对象外什么都不做。任何其他CLR对象都没有任何特殊或不同之处。这是因为实际上没有任何内容被编组到非托管代码中。

但是,在第二行上,创建COM callable wrapper并编组到非托管代码。可以将此视为runtime callable wrapper的反向,将非托管代码的调用处理回COM接口的托管实现。

问题2:

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