Est-il possible (avec le nouveau mot-clé dynamique en C# 4.0) d'utiliser des interfaces (comme IShellItem ou d'autres interfaces WinAPI) sans les définir dans mon C# code source? Ou au moins ne pas définir les membres de l'interface?C# 4.0 objet dynamique et interfaces WinAPI comme IShellItem (sans les définir dans la source C#)
J'essaie quelque chose comme:
const string IShellItemGuid = "43826D1E-E718-42EE-BC55-A1E261C37BFE";
Guid guid = new Guid(IShellItemGuid);
dynamic nativeShellItem = null;
// Create and initializes a Shell item object (IShellItem) from a parsing name
SHCreateItemFromParsingName(@"M:\TEST.TXT", IntPtr.Zero, guid, out nativeShellItem);
if (nativeShellItem != null)
{
MessageBox.Show(nativeShellItem.GetDisplayName(0));
}
où
[DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
static extern void SHCreateItemFromParsingName(
[In][MarshalAs(UnmanagedType.LPWStr)] string pszPath,
[In] IntPtr pbc,
[In][MarshalAs(UnmanagedType.LPStruct)] Guid iIdIShellItem,
[Out][MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] out dynamic iShellItem);
Le SHCreateItemFromParsingName fonctionne très bien et je reçois un objet si le fichier existe (et un message d'erreur correct si le fichier n'existe pas), mais, en essayant d'appeler nativeShellItem.GetDisplayName me donne une exception d'exécution:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException était non gérée: 'System .__ ComObject' ne contient pas de définition pour 'GetDisplayName'
bien IShellItem a une méthode appelée GetDisplayName, et mon nativeShellItem objet dynamique renvoyé par SHCreateItemFromParsingName doit implémenter cette interface.