private static bool EnsureActivateContextCreated() { lock (_contextCreationLock) { if (!_contextCreationSucceeded) { // Pull manifest from the .NET Framework install // directory string assemblyLoc = null; assemblyLoc = typeof(Object).Assembly.Location; string manifestLoc = null; string installDir = null; if (assemblyLoc != null) { installDir = Path.GetDirectoryName(assemblyLoc); const string manifestName = "XPThemes.manifest"; manifestLoc = Path.Combine(installDir, manifestName); } if (manifestLoc != null && installDir != null) { _enableThemingActivationContext = new NativeMethods.ACTCTX(); _enableThemingActivationContext.cbSize = Marshal.SizeOf(typeof(NativeMethods.ACTCTX)); _enableThemingActivationContext.lpSource = manifestLoc; // Set the lpAssemblyDirectory to the install // directory to prevent Win32 Side by Side from // looking for comctl32 in the application // directory, which could cause a bogus dll to be // placed there and open a security hole. _enableThemingActivationContext.lpAssemblyDirectory = installDir; _enableThemingActivationContext.dwFlags = NativeMethods.ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID; // Note this will fail gracefully if file specified // by manifestLoc doesn't exist. _activationContext = NativeMethods.CreateActCtx(ref _enableThemingActivationContext); _contextCreationSucceeded = !_activationContext.IsInvalid; } } // If we return false, we'll try again on the next call into // EnsureActivateContextCreated(), which is fine. return(_contextCreationSucceeded); } }
public static extern bool ActivateActCtx(ActivationContextSafeHandle hActCtx, out IntPtr lpCookie);