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

C# 为什么C“允许从中的接口构造对象”;新的Shell32.Shell();?,c#,interface,shell32.dll,C#,Interface,Shell32.dll,我知道在C#中,通常不能创建抽象类或接口的实例。有人能帮我理解这段代码吗(它编译时没有任何错误) Shell32.Shell是来自“Shell32.dll”的接口 我尝试了以下操作,但没有编译: [CoClass(typeof(ShellClass))] [Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")] public interface OtherShell : Shell { } OtherShell shObj = new OtherShell()

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

Shell32.Shell
是来自“Shell32.dll”的接口

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

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

更新:

为了让它工作,我只需要添加
coimport
属性并更改co类(我不能选择Shell32.ShellClass)


谢谢大家

如果在Visual Studio中的Shell32.Shell上单击鼠标右键并转到“定义”,您将获得以下界面定义:

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();

除了所有其他信息外,下面是它如何生成编译代码的结果。接口的使用仅仅是代码的精确性

IL_000c: newobj       instance void [Interop.Shell32]Shell32.ShellClass::.ctor()
也就是说,它是基于[CoClass]属性从接口“到”类的编译时转换

Per,其中显示了一个最小的示例案例:

[除了CoClassAttribute,您]还需要ComImportAttribute和GuidAttribute才能工作


这是一个COM对象。将COM DLL导入项目时,将生成互操作程序集。这里还有一些其他的魔力——实际的类是'Shell32.ShellClass'。在“new Shell”代码上使用代码导航会移动到ShellClass实现,而不是Shell接口,因此还有更大的魔力..什么让你认为它是一个接口?@BuhBuh查看互操作程序集:“[Guid(“286E6f16lang1024-7113-4355-9562-96B7E9D64C54”)][CoClass(typeof(ShellClass))][ComImport]公共接口Shell..”(ShellClass扩展了Shell)。简短回答:你是对的,接口不能实例化。你偶然发现的是一块晦涩难懂的语法糖,有助于COM类的实例化。不需要标记问题已解决-答案就是这样。你可以随时回答自己的问题。我想知道“创建”的原因是什么对象(对于右边的impl.)来尊重CoClass属性..?也就是说,C#/specify如何知道这个接口是特殊的,或者属性本身是否足够(魔法发生在什么“级别”上)?是否生成了特殊的MSIL(和/或它与普通的ctor调用有何不同);也就是说,选择ShellClass是运行时魔术还是编译时魔术?这可以记录在哪里?这里讨论的CoClassAttribute也只是给出了一个高级解释,但没有给出细节:(如果我们决定.NET不能实例化接口,那么必须有某种“特殊机制”,通过这种机制,看起来像接口的实例化被“转换”为实际的对象创建。@Adrian在那里回答说“如何使它工作”,但没有说它是如何工作的。:}获得源代码(所有可用)仔细研究一下,这与C#自己的语言标准非常不符,C#自己的语言标准规定你不能实例化接口…@Adrian这是一个“神奇的编译器转换”,独角兽和会说话的猫D:我明白了,如果它真的是被指定的东西那就好了。@Adrian我也希望更好。.关于这种行为的文档:}
IL_000c: newobj       instance void [Interop.Shell32]Shell32.ShellClass::.ctor()