gpt4 book ai didi

c# - 如何处理失败的 DllImport?

转载 作者:太空狗 更新时间:2023-10-30 00:13:08 24 4
gpt4 key购买 nike

我正在尝试编写一个 C# 托管类来包装 SHGetKnownFolderPath,到目前为止它可以在 Vista 上运行,但由于在 shell32.dll 中找不到正确的函数而在 XP 上崩溃,正如预期的那样。

我想对其进行设置,以便在使用 XP 时可以使用 System.Environment.GetFolderPath 回退到一个(公认的 hacky)解决方案。 (或者,如果它在 shell32 中找不到函数,则更好。)

除了条件编译,还有什么办法可以做到这一点吗?

我当前的代码如下:

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

最佳答案

在 try-catch block 中包装对 SHGetKnownFolderPath 的调用。捕获 System.EntryPointNotFoundException 然后尝试您的替代解决方案:

public static string GetKnownFolderPath(Guid guid)
{
try
{
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);
}
catch(EntryPointNotFoundException ex)
{
DoAlternativeSolution();
}
}

关于c# - 如何处理失败的 DllImport?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/970017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com