为什么C#允许从“新Shell32.Shell()”中的接口构造对象?

时间:2018-10-09 15:50:41

标签: c# interface shell32.dll

我知道通常在C#中您不能创建抽象类或接口的实例。有人可以帮助我理解此代码(它编译时没有任何错误)。

Shell32.Shell shObj = new Shell32.Shell();

Shell32.Shell是'shell32.dll'的接口

我尝试了以下操作,但未编译:

[CoClass(typeof(ShellClass))]
[Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
public interface OtherShell : Shell
{
}
OtherShell shObj = new OtherShell();

更新:

要使其工作,我只需要添加ComImport属性并更改共同类(我不能选择Shell32.ShellClass)。

谢谢大家!

2 个答案:

答案 0 :(得分:3)

除所有其他信息外,这是如何生成编译代码的方法。该接口的使用仅仅是代码方面的好处。

IL_000c: newobj       instance void [Interop.Shell32]Shell32.ShellClass::.ctor()

也就是说,这是基于[CoClass]属性从接口“到”类的编译时转换。

https://stackoverflow.com/a/1094140/2864740,其中显示了一个最小的示例情况:

  

[除了CoClassAttribute之外,您] 还需要ComImportAttribute和GuidAttribute才能起作用

答案 1 :(得分:2)

如果右键单击Shell32.Shell上的Visual Studio,然后转到定义,您将获得以下接口定义:

using System.Runtime.InteropServices;

namespace Shell32
{
    [CoClass(typeof(ShellClass))]
    [Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
    public interface Shell : IShellDispatch6
    {
    }
}

在ShellClass上执行相同的操作,您将获得在代码中创建的具体类:

Shell32.Shell shObj = new Shell32.Shell();