Да, это не может работать, в DLR нет информации о типе COM-объекта. Это печально известная проблема в программировании оболочки, в которой используются интерфейсы, основанные на IUnknown, а не IDispatch, поэтому позднее связывание не поддерживается. И для них нет доступной библиотеки типов, которая позволяет .NET легко создавать библиотеки взаимодействия для типов интерфейсов.
IShellItem объявлен в ShObjIdl.idl, он заполнен cpp_quote (). Что побеждает любую попытку использовать midl.exe для создания библиотеки типов, может быть создан только файл .h. Уже предоставлено, кстати, ShObjIdl.h. Только компилятор C ++ может использовать его.
Повторное объявление интерфейса в C # технически возможно с атрибутами [ComImport], [Guid] и [PreserveSig]. Вы должны делать это очень осторожно, к счастью, IShellItem наследуется непосредственно от IUnknown, так что вы можете избежать множественного наследования. Что не помогает, так это то, что метод интерфейса использует нативные типы C, которые не выполняются автоматически. В частности, GetDisplayName () принимает LPWSTR, необработанный указатель на строку Unicode. Не BSTR, строковый тип, совместимый с автоматизацией. Это требует от вас возиться с небезопасными указателями в вашем коде C #. Лучше всего объявить это IntPtr, выделить часть памяти с помощью Marshal.AllocCoTaskMem () и выполнить маршалинг строки самостоятельно после вызова с помощью Marshal.PtrToStringUni ().
Тьфу, программирование оболочки - полная лава. Google черт возьми, чтобы вы могли скопировать / вставить то, что, как известно, работает. Если это окажется пустым, лучше использовать C ++ / CLI, чтобы вы могли использовать ShObjIdl.h. Удачи с этим.