C# 使用非托管代码中的托管COM对象
假设我有一个众所周知的界面C# 使用非托管代码中的托管COM对象,c#,.net,com,interop,clr,C#,.net,Com,Interop,Clr,假设我有一个众所周知的界面IWellKnownInterface,它是COM可见的并已注册 我还拥有此对象的托管(C#,)实现: public class MyWellKnownClass : IWellKnownInterface { ... } 最后,我有一个extern方法,它接受这个接口的对象: [Whatever] private static extern void ExternMethod(IWellKnownInterface veryWellKnown); 问题1: 我想
IWellKnownInterface
,它是COM可见的
并已注册
我还拥有此对象的托管(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: 第一行只创建一个对象。与任何其他CLR对象没有任何特殊或不同之处。这是因为实际上没有任何内容被封送到非托管代码 但是,在第二行,将创建一个非托管代码并将其封送到非托管代码。可以将此视为与的相反,处理从非托管代码到COM接口的托管实现的调用 问题2: 这根本不会影响通话。在这种情况下,将托管引用传递给非托管代码。
a
的类型是MyWellKnownClass
,dynamic
所做的唯一一件事就是更改对托管代码的调用的解析方式。创建COM可调用包装时,它硬引用了MyWellKnownClass
的实例,而不是动态
变量;唯一改变的是,当调用ExternMethod
时,所调用方法的解析发生在运行时,而不是编译时