static UnsafeNativeMethods() { // This static contructor was added to make sure we load the proper version of Penimc.dll. // // Details: // P/invoke will use LoadLibrary to load penimc.dll and it will check the current // application directory before checking the system32 directory where this DLL // is installed to. If penimc.dll happens to be in the application directory as well // as the system32 directory we'll actually end up loaded two versions of // penimc.dll. One that we'd use for P/invokes and one that we'd use for COM. // If this happens then our Stylus code will fail since it relies on both P/invoke and COM // calls to talk to penimc.dll and it requires just one instance of this DLL to work. // // DDVSO:474688 // We cannot rely on COM to load PenIMC. The CoCreate call can re-enter, potentially deadlocking. // // 1) CoCreate is COM Pumped and re-enters off of an EnableCore call // 2) Message for, say, device changed or tablet added is received. // 3) Work is sent to the PenThread and the UI thread waits on it // 4) PenThread accesses MS.Win32.Penimc.UnsafeNativeMethods // // At this point, the static constructor has not finished and the CLR blocks the PenThread on the // completion of the constructor. However, the UI thread cannot complete the constructor call until // the PenThread returns. // // Instead, use LoadLibrary with a full path here to ensure it won't load local binaries and we don't re-enter. WpfLibraryLoader.EnsureLoaded(ExternDll.Penimc); }
static OSVersionHelper() { WpfLibraryLoader.EnsureLoaded(MS.Win32.ExternDll.PresentationNativeDll); IsOsWindows10RS5OrGreater = IsWindows10RS5OrGreater(); IsOsWindows10RS3OrGreater = IsWindows10RS3OrGreater(); IsOsWindows10RS2OrGreater = IsWindows10RS2OrGreater(); IsOsWindows10RS1OrGreater = IsWindows10RS1OrGreater(); IsOsWindows10TH2OrGreater = IsWindows10TH2OrGreater(); IsOsWindows10TH1OrGreater = IsWindows10TH1OrGreater(); IsOsWindows10OrGreater = IsWindows10OrGreater(); IsOsWindows8Point1OrGreater = IsWindows8Point1OrGreater(); IsOsWindows8OrGreater = IsWindows8OrGreater(); IsOsWindows7SP1OrGreater = IsWindows7SP1OrGreater(); IsOsWindows7OrGreater = IsWindows7OrGreater(); IsOsWindowsVistaSP2OrGreater = IsWindowsVistaSP2OrGreater(); IsOsWindowsVistaSP1OrGreater = IsWindowsVistaSP1OrGreater(); IsOsWindowsVistaOrGreater = IsWindowsVistaOrGreater(); IsOsWindowsXPSP3OrGreater = IsWindowsXPSP3OrGreater(); IsOsWindowsXPSP2OrGreater = IsWindowsXPSP2OrGreater(); IsOsWindowsXPSP1OrGreater = IsWindowsXPSP1OrGreater(); IsOsWindowsXPOrGreater = IsWindowsXPOrGreater(); IsOsWindowsServer = IsWindowsServer(); }
static OSVersionHelper() { WpfLibraryLoader.EnsureLoaded("PresentationNative_v0400.dll"); OSVersionHelper.IsOsWindows10RS5OrGreater = OSVersionHelper.IsWindows10RS5OrGreater(); OSVersionHelper.IsOsWindows10RS3OrGreater = OSVersionHelper.IsWindows10RS3OrGreater(); OSVersionHelper.IsOsWindows10RS2OrGreater = OSVersionHelper.IsWindows10RS2OrGreater(); OSVersionHelper.IsOsWindows10RS1OrGreater = OSVersionHelper.IsWindows10RS1OrGreater(); OSVersionHelper.IsOsWindows10TH2OrGreater = OSVersionHelper.IsWindows10TH2OrGreater(); OSVersionHelper.IsOsWindows10TH1OrGreater = OSVersionHelper.IsWindows10TH1OrGreater(); OSVersionHelper.IsOsWindows10OrGreater = OSVersionHelper.IsWindows10OrGreater(); OSVersionHelper.IsOsWindows8Point1OrGreater = OSVersionHelper.IsWindows8Point1OrGreater(); OSVersionHelper.IsOsWindows8OrGreater = OSVersionHelper.IsWindows8OrGreater(); OSVersionHelper.IsOsWindows7SP1OrGreater = OSVersionHelper.IsWindows7SP1OrGreater(); OSVersionHelper.IsOsWindows7OrGreater = OSVersionHelper.IsWindows7OrGreater(); OSVersionHelper.IsOsWindowsVistaSP2OrGreater = OSVersionHelper.IsWindowsVistaSP2OrGreater(); OSVersionHelper.IsOsWindowsVistaSP1OrGreater = OSVersionHelper.IsWindowsVistaSP1OrGreater(); OSVersionHelper.IsOsWindowsVistaOrGreater = OSVersionHelper.IsWindowsVistaOrGreater(); OSVersionHelper.IsOsWindowsXPSP3OrGreater = OSVersionHelper.IsWindowsXPSP3OrGreater(); OSVersionHelper.IsOsWindowsXPSP2OrGreater = OSVersionHelper.IsWindowsXPSP2OrGreater(); OSVersionHelper.IsOsWindowsXPSP1OrGreater = OSVersionHelper.IsWindowsXPSP1OrGreater(); OSVersionHelper.IsOsWindowsXPOrGreater = OSVersionHelper.IsWindowsXPOrGreater(); OSVersionHelper.IsOsWindowsServer = OSVersionHelper.IsWindowsServer(); }
static NativeMethodsSetLastError() { // load the installed version of native DLLs, so that P/Invokes call the right methods WpfLibraryLoader.EnsureLoaded(PresentationNativeDll); }