Je tente d'écrire une classe gérée C# pour envelopper SHGetKnownFolderPath, jusqu'à présent cela fonctionne sur Vista, mais se bloque sur XP en raison de ne pas trouver la fonction correcte dans shell32.dll, comme prévu.Comment gérer un DllImport échoué?
Je veux l'avoir configuré pour que je puisse me replier sur une solution (certes hacky) en utilisant System.Environment.GetFolderPath si j'utilise XP. (Ou, mieux encore, s'il ne trouve pas la fonction dans shell32.)
Y at-il un moyen de faire cette compilation autre que conditionnelle?
Mon code actuel ressemble à:
public abstract class KnownFolders
{
[DllImport("shell32.dll")]
private static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
// Trim properties to get various Guids.
public static string GetKnownFolderPath(Guid guid)
{
IntPtr pPath;
int result = SHGetKnownFolderPath(guid, 0, IntPtr.Zero, out pPath);
if (result == 0)
{
string s = Marshal.PtrToStringUni(pPath);
Marshal.FreeCoTaskMem(pPath);
return s;
}
else
throw new System.ComponentModel.Win32Exception(result);
}
}
D'accord, cela fonctionne, mais avec un petit changement. J'ai dû attraper une EntryPointNotFoundException, pas une exception DllNotFoundException. Voyant que la fonction provient de shell32.dll, il est peu probable qu'elle soit manquante sur une plateforme Windows fonctionnelle. – MiffTheFox
Oui, c'est exact, je vais mettre à jour ma réponse pour refléter l'exception réelle. – heavyd