1 //------------------------------------------------------------------------------ 2 // <copyright file="IISVersionHelper.cs" company="Microsoft"> 3 // Copyright (c) Microsoft Corporation. All rights reserved. 4 // </copyright> 5 //------------------------------------------------------------------------------ 6 7 using System.Runtime.InteropServices; 8 namespace System.Web.Configuration { 9 internal class IISVersionHelper : IDisposable { 10 const int IIS_PRODUCT_EXPRESS = 2; 11 12 [ComImport, Guid("1B036F99-B240-4116-A6A0-B54EC5B2438E"), InterfaceType((short)1)] 13 interface IIISVersion { 14 [return: MarshalAs(UnmanagedType.Struct)] GetPropertyValue([In, MarshalAs(UnmanagedType.BStr)] string bstrName)15 object GetPropertyValue([In, MarshalAs(UnmanagedType.BStr)] string bstrName); 16 [return: MarshalAs(UnmanagedType.Struct)] CreateObjectFromProgId([In, MarshalAs(UnmanagedType.BStr)] string bstrObjectName)17 object CreateObjectFromProgId([In, MarshalAs(UnmanagedType.BStr)] string bstrObjectName); 18 [return: MarshalAs(UnmanagedType.Struct)] CreateObjectFromClsId([In] Guid clsidObject)19 object CreateObjectFromClsId([In] Guid clsidObject); ApplyIISEnvironmentVariables()20 void ApplyIISEnvironmentVariables(); ClearIISEnvironmentVariables()21 void ClearIISEnvironmentVariables(); ApplyManifestContext()22 void ApplyManifestContext(); ClearManifestContext()23 void ClearManifestContext(); 24 } 25 26 [ComImport, InterfaceType((short)1), Guid("9CDA0717-2EB5-42b3-B5B0-16F4941B2029")] 27 interface IIISVersionManager { 28 [return: MarshalAs(UnmanagedType.Interface)] GetVersionObject([In, MarshalAs(UnmanagedType.BStr)] string bstrVersion, [In, MarshalAs(UnmanagedType.I4)] int productType)29 IIISVersion GetVersionObject([In, MarshalAs(UnmanagedType.BStr)] string bstrVersion, [In, MarshalAs(UnmanagedType.I4)] int productType); 30 [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] GetAllVersionObjects()31 IIISVersion[] GetAllVersionObjects(); 32 } 33 34 IIISVersionManager _versionManager; 35 IIISVersion _version; 36 IISVersionHelper(string version)37 internal IISVersionHelper(string version) { 38 // version is null if we're supposed to use the OS's IIS installation 39 if (version == null) 40 return; 41 42 try { 43 _versionManager = CreateVersionManager(); 44 _version = _versionManager.GetVersionObject(version, IIS_PRODUCT_EXPRESS); 45 _version.ApplyManifestContext(); 46 } 47 catch { 48 Release(); 49 throw; 50 } 51 } 52 CreateVersionManager()53 private static IIISVersionManager CreateVersionManager() { 54 Type type = Type.GetTypeFromProgID("Microsoft.IIS.VersionManager", throwOnError: true); 55 return (IIISVersionManager)Activator.CreateInstance(type); 56 } 57 Dispose()58 public void Dispose() { 59 if (_version != null) { 60 _version.ClearManifestContext(); 61 Release(); 62 } 63 } 64 Release()65 private void Release() { 66 if (_version != null) { 67 Marshal.ReleaseComObject(_version); 68 _version = null; 69 } 70 if (_versionManager != null) { 71 Marshal.ReleaseComObject(_versionManager); 72 _versionManager = null; 73 } 74 } 75 } 76 } 77