由于Osversion现在不可靠,因为Windows 10已经发布(这个函数报告Windows 10的Windows 10),我试图在我的C#应用程序中使用新的版本帮助器API函数。 他们在这里 。
我很抱歉,如果这只是我的DLL导入问题,但这里是我试图拉入这些新的方法来正确检测操作系统。
[DllImport("kernel32.dll",CharSet = CharSet.Auto)] public static extern bool IsWindows7OrGreater(); [DllImport("kernel32.dll",CharSet = CharSet.Auto)] public static extern bool IsWindows8OrGreater(); [DllImport("kernel32.dll",CharSet = CharSet.Auto)] public static extern bool IsWindows8Point1OrGreater(); [DllImport("kernel32.dll",CharSet = CharSet.Auto)] public static extern bool IsWindows10OrGreater();
exception是:EntryPointNotFoundException – 无法在DLL'kernel32.dll'中find名为“IsWindows7OrGreater”的入口点。
符号链接.net 4.5应用程序将无法正常工作
C# – ScheduledTasks类 – 如何指定本地主机?
如何检查.NET框架是否安装
沟通策略:Linux到.Net over SSL
难道我做错了什么? 有人有主意吗? 谢谢你的帮助!
编辑:请参阅接受的答案,并看看这个代码项目移植到C#这些方法的良好开端。
我可以在Windows上加载一个32位DLL到64位进程吗?
在特定的桌面上启动进程
什么是.NET平台文件扩展名?
不幸的是,这比这更复杂一点。 “函数”实际上是在VersionHelpers.h定义的宏。
如果你想到了,这是唯一的方法 – 他们不能追溯功能添加到较旧的Windows版本。
您必须将宏移植到C#。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.--> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- If your application is designed to work with Windows 7,uncomment the following supportedOS node--> <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>--> </application> </compatibility>
使用下面的类
using System; using System.Runtime.InteropServices; namespace VersionHelper { public static class VersionHelper { const byte VER_EQUAL = 1; const byte VER_GREATER = 2; const byte VER_GREATER_EQUAL = 3; const byte VER_LESS = 4; const byte VER_LESS_EQUAL = 5; const byte VER_AND = 6; const byte VER_OR = 7; const byte VER_CONDITION_MASK = 7; const byte VER_NUM_BITS_PER_CONDITION_MASK = 3; // // RtlVerifyVersionInfo() type mask bits // const uint VER_MInorVERSION = 0x0000001; const uint VER_MAJORVERSION = 0x0000002; const uint VER_BUILDNUMBER = 0x0000004; const uint VER_PLATFORMID = 0x0000008; const uint VER_SERVICEPACKMInor = 0x0000010; const uint VER_SERVICEPACKMAJOR = 0x0000020; const uint VER_SUITENAME = 0x0000040; const uint VER_PRODUCT_TYPE = 0x0000080; // wProductType // Any additional @R_436_4045@ion about the system.This member can be one of the following values. const byte VER_NT_DOMAIN_CONTROLLER = 0x0000002; const byte VER_NT_SERVER = 0x0000003; const byte VER_NT_WORKSTATION = 0x0000001; // // _WIN32_WINNT version constants // const ushort _WIN32_WINNT_NT4 = 0x0400; const ushort _WIN32_WINNT_WIN2K = 0x0500; const ushort _WIN32_WINNT_WINXP = 0x0501; const ushort _WIN32_WINNT_WS03 = 0x0502; const ushort _WIN32_WINNT_WIN6 = 0x0600; const ushort _WIN32_WINNT_VISTA = 0x0600; const ushort _WIN32_WINNT_WS08 = 0x0600; const ushort _WIN32_WINNT_LONGHORN = 0x0600; const ushort _WIN32_WINNT_WIN7 = 0x0601; const ushort _WIN32_WINNT_WIN8 = 0x0602; const ushort _WIN32_WINNT_WINBLUE = 0x0603; const ushort _WIN32_WINNT_WINTHRESHOLD = 0x0A00; /* ABRACADABRA_THRESHOLD*/ const ushort _WIN32_WINNT_WIN10 = 0x0A00; /* ABRACADABRA_THRESHOLD*/ const bool FALSE = false; static byte LOBYTE(ushort w) { return ((byte)(w & 0xff)); } static byte HIBYTE(ushort w) { return ((byte)(w >> 8 & 0xff)); } [DllImport("kernel32.dll")] static extern ulong VerSetConditionMask(ulong ConditionMask,uint TypeMask,byte Condition ); [DllImport("kernel32.dll")] static extern bool VerifyVersionInfoW(ref OsveRSIONINFOEXW lpVersion@R_436_4045@ion,uint dwTypeMask,ulong dwlConditionMask); [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)] struct OsveRSIONINFOEXW { public int dwOsversionInfoSize; public int dwMajorVersion; public int dwMinorVersion; public int dwBuildNumber; public int dwPlatformId; [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)] public string szCSDVersion; public UInt16 wServicePackMajor; public UInt16 wServicePackMinor; public UInt16 wSuiteMask; public byte wProductType; public byte wReserved; } public static bool IsWindowsversionorGreater(ushort wMajorVersion,ushort wMinorVersion,ushort wServicePackMajor) { var osvi = new OsveRSIONINFOEXW { dwOsversionInfoSize = Marshal.SizeOf(typeof(OsveRSIONINFOEXW)) }; var dwlConditionMask = VerSetConditionMask( VerSetConditionMask( VerSetConditionMask( 0,VER_MAJORVERSION,VER_GREATER_EQUAL),VER_MInorVERSION,VER_SERVICEPACKMAJOR,VER_GREATER_EQUAL); osvi.dwMajorVersion = wMajorVersion; osvi.dwMinorVersion = wMinorVersion; osvi.wServicePackMajor = wServicePackMajor; return VerifyVersionInfoW(ref osvi,VER_MAJORVERSION | VER_MInorVERSION | VER_SERVICEPACKMAJOR,dwlConditionMask) != FALSE; } public static bool IsWindowsXPOrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINXP),LOBYTE(_WIN32_WINNT_WINXP),0); } public static bool IsWindowsXPSP1OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINXP),1); } public static bool IsWindowsXPSP2OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINXP),2); } public static bool IsWindowsXPSP3OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINXP),3); } public static bool IsWindowsVistaOrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_VISTA),LOBYTE(_WIN32_WINNT_VISTA),0); } public static bool IsWindowsVistaSP1OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_VISTA),1); } public static bool IsWindowsVistaSP2OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_VISTA),2); } public static bool IsWindows7OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WIN7),LOBYTE(_WIN32_WINNT_WIN7),0); } public static bool IsWindows7SP1OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WIN7),1); } public static bool IsWindows8OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WIN8),LOBYTE(_WIN32_WINNT_WIN8),0); } public static bool IsWindows8Point1OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINBLUE),LOBYTE(_WIN32_WINNT_WINBLUE),0); } public static bool IsWindowsThresholdOrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD),LOBYTE(_WIN32_WINNT_WINTHRESHOLD),0); } public static bool IsWindows10OrGreater() { return IsWindowsversionorGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD),0); } public static bool IsWindowsserver() { var osvi = new OsveRSIONINFOEXW { dwOsversionInfoSize = Marshal.SizeOf(typeof(OsveRSIONINFOEXW)),wProductType = VER_NT_WORKSTATION }; var dwlConditionMask = VerSetConditionMask(0,VER_PRODUCT_TYPE,VER_EQUAL); return !VerifyVersionInfoW( ref osvi,dwlConditionMask); } } }
VersionHelpers函数不会在任何dll中导出,而是在VersionHelpers.h文件中定义的,为了利用C#代码中的功能,您可以从头文件复制功能,
导入这两个功能:
[DllImport("kernel32.dll")] static extern ulong VerSetConditionMask(ulong dwlConditionMask,uint dwTypeBitMask,byte dwConditionMask); [DllImport("kernel32.dll")] static extern bool VerifyVersionInfo([In] ref OsversionInfoEx lpVersionInfo,ulong dwlConditionMask);
定义以下结构:
[StructLayout(LayoutKind.Sequential)] struct OsversionInfoEx { public uint OsversionInfoSize; public uint MajorVersion; public uint MinorVersion; public uint BuildNumber; public uint PlatformId; [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)] public string CSDVersion; public ushort ServicePackMajor; public ushort ServicePackMinor; public ushort SuiteMask; public byte ProductType; public byte Reserved; }
然后使用以下功能:
static bool IsWindowsversionorGreater(uint majorVersion,uint minorVersion,ushort servicePackMajor) { OsversionInfoEx osvi = new OsversionInfoEx(); osvi.OsversionInfoSize = (uint)Marshal.SizeOf(osvi); osvi.MajorVersion = majorVersion; osvi.MinorVersion = minorVersion; osvi.ServicePackMajor = servicePackMajor; // These constants initialized with corresponding deFinitions in // winnt.h (part of Windows SDK) const uint VER_MInorVERSION = 0x0000001; const uint VER_MAJORVERSION = 0x0000002; const uint VER_SERVICEPACKMAJOR = 0x0000020; const byte VER_GREATER_EQUAL = 3; ulong versionorGreaterMask = VerSetConditionMask( VerSetConditionMask( VerSetConditionMask( 0,VER_GREATER_EQUAL); uint versionorGreaterTypeMask = VER_MAJORVERSION |VER_MInorVERSION | VER_SERVICEPACKMAJOR; return VerifyVersionInfo(ref osvi,versionorGreaterTypeMask,versionorGreaterMask);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。