Почему C # позволяет создавать объект из интерфейса в "новом Shell32.Shell ()"? - PullRequest
0 голосов
/ 09 октября 2018

Я знаю, что в 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 голосов
/ 09 октября 2018

В дополнение ко всей другой информации, здесь how приводит к скомпилированному коду.Использование интерфейса - это просто тонкость кода.

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

То есть это преобразование во время компиляции из интерфейса "в" класс на основе [CoClass]]GuidAttribute для его работы .

0 голосов
/ 09 октября 2018

Если вы щелкните правой кнопкой мыши в 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();
...