¿Cómo manejo un DllImport fallido?

Estoy intentando escribir una clase administrada en C # para envolver SHGetKnownFolderPath, hasta ahora funciona en Vista, pero se bloquea en XP debido a que no se encuentra la función adecuada en shell32.dll, como se esperaba.

Quiero configurarlo para poder recurrir a una solución (ciertamente hacky) usando System.Environment.GetFolderPath si usa XP. (O, mejor aún, si no puede encontrar la función en shell32.)

¿Hay alguna manera de hacer esto aparte de la compilación condicional?

Mi código actual se ve así:

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);
        }
    }

Respuestas a la pregunta(4)

Su respuesta a la pregunta