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

Я знаю, что в 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 ответа

Решение

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

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

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

Per, /questions/42864537/kak-kompilyator-c-obnaruzhivaet-tipyi-com/42864555#42864555, где показан минимальный пример:

[В дополнение к CoClassAttribute, вам] нужны и ComImportAttribute, и GuidAttribute для его работы.

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