我知道通常在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)。
谢谢大家!
答案 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();