Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用非托管代码中的托管COM对象_C#_.net_Com_Interop_Clr - Fatal编程技术网

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
时,所调用方法的解析发生在运行时,而不是编译时