Почему 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();