为什么 C# 允许从 "new Shell32.Shell()" 中的接口构造对象?
Why does C# allow constructing an object from an interface in "new Shell32.Shell()"?
我知道在 C# 中通常不能创建抽象 class 或接口的实例。谁能帮我理解这段代码(编译没有任何错误)。
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
属性并更改 co-class(我不能选择 Shell32.ShellClass)。
谢谢大家!
如果您在 Shell32.Shell 上的 Visual Studio 中右键单击并转到定义,您将获得以下接口定义:
using System.Runtime.InteropServices;
namespace Shell32
{
[CoClass(typeof(ShellClass))]
[Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
public interface Shell : IShellDispatch6
{
}
}
对 ShellClass 执行相同操作,您将获得在您的代码中创建的具体 class:
Shell32.Shell shObj = new Shell32.Shell();
除了所有其他信息外,这里是如何编译代码的结果。接口的使用仅仅是代码的精巧。
IL_000c: newobj instance void [Interop.Shell32]Shell32.ShellClass::.ctor()
也就是说,它是编译时从接口"to"到class的转换,基于[CoClass]属性。
Per,,显示了一个最小的示例:
[In addition to CoClassAttribute, you] need both the ComImportAttribute and the GuidAttribute for it to work.
我知道在 C# 中通常不能创建抽象 class 或接口的实例。谁能帮我理解这段代码(编译没有任何错误)。
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
属性并更改 co-class(我不能选择 Shell32.ShellClass)。
谢谢大家!
如果您在 Shell32.Shell 上的 Visual Studio 中右键单击并转到定义,您将获得以下接口定义:
using System.Runtime.InteropServices;
namespace Shell32
{
[CoClass(typeof(ShellClass))]
[Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
public interface Shell : IShellDispatch6
{
}
}
对 ShellClass 执行相同操作,您将获得在您的代码中创建的具体 class:
Shell32.Shell shObj = new Shell32.Shell();
除了所有其他信息外,这里是如何编译代码的结果。接口的使用仅仅是代码的精巧。
IL_000c: newobj instance void [Interop.Shell32]Shell32.ShellClass::.ctor()
也就是说,它是编译时从接口"to"到class的转换,基于[CoClass]属性。
Per,,显示了一个最小的示例:
[In addition to CoClassAttribute, you] need both the ComImportAttribute and the GuidAttribute for it to work.