我们有一个在 .NET 1.x 时代编写的旧版 WinForms 应用程序,可能需要更改检查应用程序是否使用操作系统视觉样式呈现的代码,原因如下所述。执行此工作的当前函数如下所示:
private bool IsComCtl6
{
get
{
if (!fIsComCtl6Initialized)
{
IntPtr hMod = NativeMethods.LoadLibrary("comctl32.dll");
if (hMod != IntPtr.Zero)
{
IntPtr lptrDLLVersion = NativeMethods.GetProcAddress(hMod, "DllGetVersion");
if (lptrDLLVersion != IntPtr.Zero)
{
hMod = NativeMethods.LoadLibrary("uxtheme.dll");
if (hMod != IntPtr.Zero)
{
NativeMethods.DllVersionInfo dvi = new NativeMethods.DllVersionInfo();
dvi.cbSize = Marshal.SizeOf(typeof(NativeMethods.DllVersionInfo));
if (NativeMethods.DllGetVersion(ref dvi) == NativeMethods.S_OK)
fIsComCtl6 = (!fCheckAppThemed || dvi.dwMajorVersion >= 6) && NativeMethods.IsThemeActive() && NativeMethods.IsAppThemed();
}
}
}
fIsComCtl6Initialized = true;
}
return fIsComCtl6;
}
}
此代码中的 NativeMethods 是一个类,其中包含所有引用的 WinAPI 函数和常量的 P-Invoke 声明。
我们希望在此代码中避免与平台无关的调用,因为它们似乎与 Mono 平台的最新版本不兼容。没有操作系统本机调用,是否有更好更短的方法来检查我们需要什么?如果我们可以仅使用本机 .NET 类来做到这一点,那就太好了。支持的 .NET 的最低版本应该是 2.0 甚至 3.5。