代码之家  ›  专栏  ›  技术社区  ›  Yippie-Ki-Yay

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

  •  5
  • Yippie-Ki-Yay  · 技术社区  · 13 年前

    假设我有一个众所周知的界面 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 回复  |  直到 13 年前
        1
  •  3
  •   casperOne    13 年前

    问题1:

    第一行只创建一个对象。与任何其他CLR对象相比,没有任何特殊或不同之处。这是因为实际上没有任何内容被封送至非托管代码。

    然而,在第二行中 COM callable wrapper 创建并封送至非托管代码。可以将此视为 runtime callable wrapper ,处理从非托管代码回COM接口的托管实现的调用。

    问题2:

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

    推荐文章