假设我有一个众所周知的界面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对象并且它在非托管代码中使用时,我找不到有关这种情况的任何信息。
dynamic
类型在相同情况下如何影响CLR
的行为?它会以某种方式改变内部托管到非托管的互操作逻辑吗?也许为MyWellKnownClass
实例添加一些额外的包装器?
dynamic a = new MyWellKnownClass();
ExternMethod(a);
答案 0 :(得分:3)
问题1:
第一行除了创建一个对象外什么都不做。任何其他CLR对象都没有任何特殊或不同之处。这是因为实际上没有任何内容被编组到非托管代码中。
但是,在第二行上,创建COM callable wrapper并编组到非托管代码。可以将此视为runtime callable wrapper的反向,将非托管代码的调用处理回COM接口的托管实现。
问题2:
dynamic
type根本不影响通话。在这种特殊情况下,您将托管引用传递给非托管代码。 a
的类型为 MyWellKnownClass
,dynamic
唯一能做的就是更改托管代码中解析对其的调用 。创建COM可调用包装器时,它具有对MyWellKnownClass
实例的硬引用,而不是dynamic
变量;唯一改变的是,当调用ExternMethod
时,调用的方法的解析在运行时而不是在编译时发生。