1. 程式人生 > >c# Com元件常用匯出介面

c# Com元件常用匯出介面

namespace Microsoft.Tools.ServiceModel.ComSvcConfig
{ 
    using System;
    using System.Collections; 
    using System.Runtime.InteropServices; 
    using System.Runtime.InteropServices.ComTypes;
    using System.Reflection; 
    using System.Security.Permissions;
    using Microsoft.Win32;
    using Microsoft.Win32.SafeHandles;
    using System.Resources; 
    using System.Text;
    using _SYSKIND = System.Runtime.InteropServices.ComTypes.SYSKIND; 
    using System.Globalization; 
    using Microsoft.Tools.ServiceModel;
    using Microsoft.Tools.ServiceModel.SvcUtil; 
    using System.Runtime.CompilerServices;
    using System.Diagnostics.CodeAnalysis;
 
  
    internal delegate int CallbackThreadSet();
    internal delegate int CallbackThreadUnset(); 
    internal delegate void RuntimeLoadedCallback(IClrRuntimeInfo pRuntimeInfo, CallbackThreadSet callbackThreadSet, CallbackThreadUnset callbackThreadUnset); 
 
    internal class RegistryHandle : SafeHandleZeroOrMinusOneIsInvalid 
    {
        internal static readonly RegistryHandle HKEY_CLASSES_ROOT         = new RegistryHandle (new IntPtr(unchecked((int)0x80000000)), false);
        internal static readonly RegistryHandle HKEY_CURRENT_USER         = new RegistryHandle (new IntPtr(unchecked((int)0x80000001)), false);
        internal static readonly RegistryHandle HKEY_LOCAL_MACHINE        = new RegistryHandle (new IntPtr(unchecked((int)0x80000002)), false); 
        internal static readonly RegistryHandle HKEY_USERS                = new RegistryHandle (new IntPtr(unchecked((int)0x80000003)), false);
        internal static readonly RegistryHandle HKEY_PERFORMANCE_DATA     = new RegistryHandle (new IntPtr(unchecked((int)0x80000004)), false); 
        internal static readonly RegistryHandle HKEY_CURRENT_CONFIG       = new RegistryHandle (new IntPtr(unchecked((int)0x80000005)), false); 
        internal static readonly RegistryHandle HKEY_DYN_DATA             = new RegistryHandle (new IntPtr(unchecked((int)0x80000006)), false);
  
        static RegistryHandle GetHKCR ()
        {
            RegistryHandle regHandle = null;
            int status = SafeNativeMethods.RegOpenKeyEx (HKEY_LOCAL_MACHINE, @"Software\Classes", 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE, out regHandle); 
            if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid)
            { 
                throw Tool.CreateException (SR.GetString (SR.FailedToOpenRegistryKey, ""), null); 
            }
            return regHandle; 
 
        }
 
        static RegistryHandle Get64bitHKCR () 
        {
           RegistryHandle regHandle = null; 
           int status = SafeNativeMethods.RegOpenKeyEx (HKEY_LOCAL_MACHINE, @"Software\Classes", 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_64KEY, out regHandle); 
           if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid)
           { 
                throw Tool.CreateException (SR.GetString (SR.FailedToOpenRegistryKey, ""), null);
           }
           return regHandle;
        } 
 
        static RegistryHandle Get32bitHKCR () 
        { 
           RegistryHandle regHandle = null;
           int status = SafeNativeMethods.RegOpenKeyEx (HKEY_LOCAL_MACHINE, @"Software\Classes", 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_32KEY, out regHandle); 
           if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid)
           {
                throw Tool.CreateException (SR.GetString (SR.FailedToOpenRegistryKey, ""), null);
           } 
           return regHandle;
        } 
  
        static RegistryHandle GetCorrectBitnessHive (bool is64bit)
        { 
            if (is64bit && IntPtr.Size == 8) // No worries we are trying to open up a 64 bit hive just return
                return GetHKCR ();
            else if (is64bit && IntPtr.Size == 4) // we are running under wow get the 64 bit hive
                return Get64bitHKCR (); 
            else if (!is64bit && IntPtr.Size == 8) // we are running in 64 bit but need to open a 32 bit hive
                return Get32bitHKCR (); 
            else if (!is64bit && IntPtr.Size == 4) 
                return GetHKCR ();
  
            throw Tool.CreateException(SR.GetString(SR.UnableToDetermineHiveBitness), null);
        }
 
        public static RegistryHandle GetBitnessHKCR (bool is64bit) 
        {
            return GetCorrectBitnessHive (is64bit); 
        } 
 
  
        public static RegistryHandle GetCorrectBitnessHKLMSubkey(bool is64bit, string key)
        {
            if (is64bit && IntPtr.Size == 8) // No worries we are trying to open up a 64 bit hive just return
                return GetHKLMSubkey(key); 
            else if (is64bit && IntPtr.Size == 4) // we are running under wow get the 64 bit hive
                return Get64bitHKLMSubkey(key); 
            else if (!is64bit && IntPtr.Size == 8) // we are running in 64 bit but need to open a 32 bit hive 
                return Get32bitHKLMSubkey(key);
            else if (!is64bit && IntPtr.Size == 4) 
                return GetHKLMSubkey(key);
 
            throw Tool.CreateException(SR.GetString(SR.UnableToDetermineHiveBitness), null);
        } 
 
        public static int TryGetCorrectBitnessHKLMSubkey(bool is64bit, string key, out RegistryHandle regHandle) 
        { 
            if (is64bit && IntPtr.Size == 8) // No worries we are trying to open up a 64 bit hive just return
                return SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE, out regHandle); 
            else if (is64bit && IntPtr.Size == 4) // we are running under wow get the 64 bit hive
                return SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_64KEY, out regHandle);
            else if (!is64bit && IntPtr.Size == 8) // we are running in 64 bit but need to open a 32 bit hive
                return SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_32KEY, out regHandle); 
            else if (!is64bit && IntPtr.Size == 4)
                return SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE, out regHandle); 
  
            throw Tool.CreateException(SR.GetString(SR.UnableToDetermineHiveBitness), null);
        } 
 
        static RegistryHandle GetHKLMSubkey(string key)
        {
            RegistryHandle regHandle = null; 
            int status = SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE, out regHandle);
            if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid) 
            { 
                throw Tool.CreateException(SR.GetString(SR.FailedToOpenRegistryKey, ""), null);
            } 
            return regHandle;
 
        }
  
        static RegistryHandle Get64bitHKLMSubkey(string key)
        { 
            RegistryHandle regHandle = null; 
            int status = SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_64KEY, out regHandle);
            if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid) 
            {
                throw Tool.CreateException(SR.GetString(SR.FailedToOpenRegistryKey, ""), null);
            }
            return regHandle; 
        }
  
        static RegistryHandle Get32bitHKLMSubkey(string key) 
        {
            RegistryHandle regHandle = null; 
            int status = SafeNativeMethods.RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE | SafeNativeMethods.KEY_WOW64_32KEY, out regHandle);
            if (status != SafeNativeMethods.ERROR_SUCCESS || null == regHandle || regHandle.IsInvalid)
            {
                throw Tool.CreateException(SR.GetString(SR.FailedToOpenRegistryKey, ""), null); 
            }
            return regHandle; 
        } 
 
  
        public RegistryHandle (IntPtr hKey, bool ownHandle) : base (ownHandle)
        {
            handle = hKey;
        } 
 
        public RegistryHandle () : base (true) 
        { 
 
  
 
        }
 
        public bool DeleteKey (string key) 
        {
            int status = SafeNativeMethods.RegDeleteKey (this, key); 
            if (status == SafeNativeMethods.ERROR_SUCCESS) 
                return true;
            else
                return false;
        }
 
        public RegistryHandle CreateSubKey (string subKey) 
        {
            RegistryHandle regHandle = null; 
            int    disposition; 
            int status = SafeNativeMethods.RegCreateKeyEx (this, subKey, 0, null, 0, SafeNativeMethods.KEY_READ | SafeNativeMethods.KEY_WRITE, IntPtr.Zero, out regHandle, out disposition );
            if (status != SafeNativeMethods.ERROR_SUCCESS || regHandle == null || regHandle.IsInvalid) 
                Tool.CreateException (SR.GetString (SR.FailedToCreateSubKey, subKey), null  );
            return regHandle;
        }
  
        public void SetValue (string valName, string value)
        { 
            int status = SafeNativeMethods.RegSetValueEx (this, valName, 0, SafeNativeMethods.REG_SZ, value, (value.Length * 2) + 2); 
            if (status != SafeNativeMethods.ERROR_SUCCESS)
                Tool.CreateException(SR.GetString(SR.FailedToSetValue, valName), null); 
        }
 
        public string GetStringValue (string valName)
        { 
            int type = 0;
            int datasize = 0; 
            int ret = SafeNativeMethods.RegQueryValueEx(this, valName, null, ref type, (byte[])null, ref datasize); 
            if (ret == SafeNativeMethods.ERROR_SUCCESS)
                if (type == SafeNativeMethods.REG_SZ) 
                {
                    byte [] blob = new byte [datasize];
                    ret = SafeNativeMethods.RegQueryValueEx(this, valName, null, ref type, (byte[]) blob, ref datasize);
                    UnicodeEncoding unicode = new UnicodeEncoding(); 
                    return unicode.GetString (blob);
                } 
            return null; 
        }
  
        protected  override bool ReleaseHandle ()
        {
            if (SafeNativeMethods.RegCloseKey (handle) == SafeNativeMethods.ERROR_SUCCESS)
                return true; 
            else
                return false; 
        } 
    }
  
    internal static class SafeNativeMethods
    {
 
  
            internal const int ERROR_MORE_DATA                 = 0xEA;
            internal const int ERROR_SUCCESS                   = 0; 
            internal const int READ_CONTROL                    = 0x00020000; 
            internal const int SYNCHRONIZE                     = 0x00100000;
            internal const int STANDARD_RIGHTS_READ            = READ_CONTROL; 
            internal const int STANDARD_RIGHTS_WRITE           = READ_CONTROL;
            internal const int KEY_QUERY_VALUE        = 0x0001;
            internal const int KEY_SET_VALUE          = 0x0002;
            internal const int KEY_CREATE_SUB_KEY     = 0x0004; 
            internal const int KEY_ENUMERATE_SUB_KEYS = 0x0008;
            internal const int KEY_NOTIFY             = 0x0010; 
            internal const int KEY_CREATE_LINK        = 0x0020; 
            internal const int KEY_READ               =((STANDARD_RIGHTS_READ       |
                                                               KEY_QUERY_VALUE            | 
                                                               KEY_ENUMERATE_SUB_KEYS     |
                                                               KEY_NOTIFY)
                                                              &
                                                              (~SYNCHRONIZE)); 
 
            internal const int KEY_WRITE              =((STANDARD_RIGHTS_WRITE      | 
                                                               KEY_SET_VALUE              | 
                                                               KEY_CREATE_SUB_KEY)
                                                              & 
                                                              (~SYNCHRONIZE));
            internal const int REG_NONE                    = 0;     // No value type
            internal const int REG_SZ                      = 1;     // Unicode nul terminated string
            internal const int REG_EXPAND_SZ               = 2;     // Unicode nul terminated string 
            internal const int KEY_WOW64_32KEY             = (0x0200);
            internal const int KEY_WOW64_64KEY             = (0x0100); 
  
 
            // (with environment variable references) 
            internal const int REG_BINARY                  = 3;     // Free form binary
            internal const int REG_DWORD                   = 4;     // 32-bit number
            internal const int REG_DWORD_LITTLE_ENDIAN     = 4;     // 32-bit number (same as REG_DWORD)
            internal const int REG_DWORD_BIG_ENDIAN        = 5;     // 32-bit number 
            internal const int REG_LINK                    = 6;     // Symbolic Link (unicode)
            internal const int REG_MULTI_SZ                = 7;     // Multiple Unicode strings 
            internal const int REG_RESOURCE_LIST           = 8;     // Resource list in the resource map 
            internal const int REG_FULL_RESOURCE_DESCRIPTOR  = 9;   // Resource list in the hardware description
            internal const int REG_RESOURCE_REQUIREMENTS_LIST = 10; 
            internal const int REG_QWORD                   = 11;    // 64-bit number
 
            internal const int HWND_BROADCAST              = 0xffff;
            internal const int WM_SETTINGCHANGE            = 0x001A; 
 
            internal const String KERNEL32 = "kernel32.dll"; 
            internal const String USER32   = "user32.dll"; 
            internal const String ADVAPI32 = "advapi32.dll";
            internal const String OLE32    = "ole32.dll"; 
            internal const String OLEAUT32 = "oleaut32.dll";
            internal const String SHFOLDER = "shfolder.dll";
            internal const String SHIM     = "mscoree.dll";
            internal const String CRYPT32  = "crypt32.dll"; 
            internal const String SECUR32  = "secur32.dll";
            internal const String MSCORWKS = "mscorwks.dll"; 
  
            [DllImport(OLE32, ExactSpelling = true, PreserveSig = false)]
            [return: MarshalAs(UnmanagedType.Interface)] 
            internal static extern object DllGetClassObject (
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid);
  
 
  
            [DllImport(ADVAPI32, CharSet=CharSet.Unicode, BestFitMapping=false)] 
            internal static extern int RegOpenKeyEx(RegistryHandle hKey, String lpSubKey,
                        int ulOptions, int samDesired, out RegistryHandle hkResult); 
 
            [DllImport(ADVAPI32, CharSet=CharSet.Unicode, BestFitMapping=false)]
            internal static extern int RegSetValueEx(RegistryHandle hKey, String lpValueName,
                        int Reserved, int dwType, String val, int cbData); 
 
            // Note: RegCreateKeyEx won't set the last error on failure - it returns 
            // an error code if it fails. 
            [DllImport(ADVAPI32, CharSet=CharSet.Unicode, BestFitMapping=false)]
            internal static extern int RegCreateKeyEx(RegistryHandle hKey, String lpSubKey, 
                        int Reserved, String lpClass, int dwOptions,
                        int samDesigner, IntPtr lpSecurityAttributes,
                        out RegistryHandle hkResult, out int lpdwDisposition);
  
            [DllImport(ADVAPI32, SetLastError=false)]
            internal static extern int RegCloseKey(IntPtr handle); 
  
            [DllImport(ADVAPI32, CharSet=CharSet.Unicode, BestFitMapping=false)]
            internal static extern int RegQueryValueEx(RegistryHandle hKey, String lpValueName, 
                        int[] lpReserved, ref int lpType, [Out] byte[] lpData,
                        ref int lpcbData);
 
            [DllImport(ADVAPI32, CharSet=CharSet.Unicode, BestFitMapping=false)] 
            internal static extern int RegDeleteKey(RegistryHandle hKey, String lpValueName);
            [DllImport(OLEAUT32, CharSet=CharSet.Unicode, BestFitMapping=false)] 
            internal static extern int CreateTypeLib2 (System.Runtime.InteropServices.ComTypes.SYSKIND sysKind, string szFile, out ICreateTypeLib ppctlib); 
 
            [DllImport(SHIM, CharSet=CharSet.Unicode)] 
            internal static extern int GetRequestedRuntimeVersionForCLSID(
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
            [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 1)] StringBuilder pVersion,
            [In] int cchBuffer, 
            ref int dwLength,
            [In] int dwResolutionFlags 
            ); 
 
            [DllImport(SHIM, CharSet = CharSet.Unicode, PreserveSig = true)] 
            internal static extern int CLRCreateInstance(
                [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
                [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid,
                [Out, MarshalAs(UnmanagedType.Interface)] out object pMetaHost); 
 
            internal static ICreateTypeLib CreateTypeLib (string file) 
            { 
                ICreateTypeLib typelib;
                int hr = CreateTypeLib2  (System.Runtime.InteropServices.ComTypes.SYSKIND.SYS_WIN32, file, out typelib); 
                if (hr == 0)
                    return typelib;
                else
                    Marshal.ThrowExceptionForHR (hr); 
                return null;
            } 
    } 
    [ComImport]
    [Guid("D5F569D0-593B-101A-B569-08002B2DBF7A")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IPSFactoryBuffer
    {
        void CreateProxy (IntPtr inner, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid,  out object proxy, out object ppv); 
        void CreateStub ();
    } 
  
    [ComImport]
    [Guid("00020406-0000-0000-C000-000000000046")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface ICreateTypeLib
    {
        [return : MarshalAs(UnmanagedType.Interface)] 
        ICreateTypeInfo CreateTypeInfo([In, MarshalAs(UnmanagedType.LPStr)] String szName,
                              System.Runtime.InteropServices.ComTypes.TYPEKIND tkind); 
        void SetName([In, MarshalAs(UnmanagedType.LPStr)] string szName); 
        void SetVersion(short wMajorVerNum, short wMinorVerNum);
        void SetGuid([In, MarshalAs(UnmanagedType.LPStruct)] Guid guid); 
        void SetDocString([In, MarshalAs(UnmanagedType.LPStr)] String szDoc);
        void SetHelpFileName([In, MarshalAs(UnmanagedType.LPStr)] String szHelpFileName);
        void SetHelpContext(int dwHelpContext);
        void SetLcid(int lcid); 
        void SetLibFlags(int uLibFlags);
        void SaveAllChanges(); 
    } 
 
    [ComImport] 
    [Guid("00020405-0000-0000-C000-000000000046")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface ICreateTypeInfo
    { 
         void SetGuid([In, MarshalAs(UnmanagedType.LPStruct)] Guid guid);
         void SetTypeFlags(int uTypeFlags); 
         void SetDocString(string doc); 
         void SetHelpContext(int dwHelpContext);
         void SetVersion (short  wMajorVerNum, short wMinorVerNum); 
         void AddRefTypeInfo(ITypeInfo  pTInfo, IntPtr  phRefType);
         void AddFuncDesc(uint index, ref System.Runtime.InteropServices.ComTypes.FUNCDESC pFuncDesc);
         void AddImplType(uint index, IntPtr hRefType);
         void SetImplTypeFlags(uint index,int implTypeFlags); 
         void SetAlignment(int cbAlignment);
         void SetSchema(string pStrSchema); 
         void AddVarDesc (uint index, ref System.Runtime.InteropServices.ComTypes.VARDESC pVarDesc); 
         void SetFuncAndParamNames();
         void SetVarName(); 
         void SetTypeDescAlias();
         void DefineFuncAsDllEntry();
         void SetFuncDocString();
         void SetVarDocString(ushort index, string szDocString); 
         void SetFuncHelpContext(ushort index, uint dwHelpContext);
         void SetVarHelpContext(ushort index, uint dwHelpContext); 
         void SetMops(ushort index,string  bstrMops); 
         void SetTypeIdldesc(ref System.Runtime.InteropServices.ComTypes.IDLDESC  pIdlDesc);
         void LayOut(); 
    }
 
    [ComImport]
    [Guid("0002040E-0000-0000-C000-000000000046")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface ICreateTypeInfo2 
    { 
         void SetGuid([In, MarshalAs(UnmanagedType.LPStruct)] Guid guid);
         void SetTypeFlags(int uTypeFlags); 
         void SetDocString(string doc);
         void SetHelpContext(int dwHelpContext);
         void SetVersion (short  wMajorVerNum, short wMinorVerNum);
         void AddRefTypeInfo(ITypeInfo  pTInfo, IntPtr  phRefType); 
         void AddFuncDesc(uint index, ref System.Runtime.InteropServices.ComTypes.FUNCDESC pFuncDesc);
         void AddImplType(uint index, IntPtr hRefType); 
         void SetImplTypeFlags(uint index,int implTypeFlags); 
         void SetAlignment(int cbAlignment);
         void SetSchema(string pStrSchema); 
         void AddVarDesc (uint index, ref System.Runtime.InteropServices.ComTypes.VARDESC pVarDesc);
         void SetFuncAndParamNames();
         void SetVarName();
         void SetTypeDescAlias(); 
         void DefineFuncAsDllEntry();
         void SetFuncDocString(); 
         void SetVarDocString(ushort index, string szDocString); 
         void SetFuncHelpContext(ushort index, uint dwHelpContext);
         void SetVarHelpContext(ushort index, uint dwHelpContext); 
         void SetMops(ushort index,string  bstrMops);
         void SetTypeIdldesc(ref System.Runtime.InteropServices.ComTypes.IDLDESC  pIdlDesc);
         void LayOut();
         void DeleteFuncDesc(ushort index); 
         void DeleteFuncDescByMemId(int memid,  System.Runtime.InteropServices.ComTypes.INVOKEKIND invKind);
         void DeleteVarDesc(ushort index); 
         void DeleteVarDescByMemId(int memid); 
         void DeleteImplType();
         void SetCustData(); 
         void SetFuncCustData();
         void SetParamCustData( );
         void SetVarCustData( );
         void SetImplTypeCustData( ); 
         void SetHelpStringContext();
         void SetFuncHelpStringContext(); 
         void SetVarHelpStringContext(); 
         void Invalidate();
         void SetName (string szName); 
    }
 
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000100-0000-0000-C000-000000000046")]
    interface IEnumUnknown 
    {
        // Legitimate reflection of native API name. 
        [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords")] 
        [PreserveSig]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        int Next(
            [In, MarshalAs(UnmanagedType.U4)] int elementArrayLength,
            [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown, SizeParamIndex = 0)] object[] elementArray,
            [MarshalAs(UnmanagedType.U4)] out int fetchedElementCount); 
 
        [PreserveSig] 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        int Skip(
            [In, MarshalAs(UnmanagedType.U4)] int count); 
 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void Reset();
  
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void Clone( 
            [MarshalAs(UnmanagedType.Interface)] out IEnumUnknown enumerator); 
    }
  
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("D332DB9E-B9B3-4125-8207-A14884F53216")]
    internal interface IClrMetaHost
    {
        [return: MarshalAs(UnmanagedType.Interface)] 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        object GetRuntime( 
            [In, MarshalAs(UnmanagedType.LPWStr)] string version, 
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceId);
  
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void GetVersionFromFile(
            [In, MarshalAs(UnmanagedType.LPWStr)] string filePath,
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder buffer, 
            [In, Out, MarshalAs(UnmanagedType.U4)] ref int bufferLength);
  
        [return: MarshalAs(UnmanagedType.Interface)] 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        IEnumUnknown EnumerateInstalledRuntimes(); 
 
        [return: MarshalAs(UnmanagedType.Interface)]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        IEnumUnknown EnumerateLoadedRuntimes( 
            [In] IntPtr processHandle);
  
        // Placeholder for RequestRuntimeLoadedNotification 
        [PreserveSig]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        int Reserved01(
            [In] IntPtr reserved1);
 
        [return: MarshalAs(UnmanagedType.Interface)] 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        object QueryLegacyV2RuntimeBinding( 
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceId); 
    }
  
 
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
    internal interface IClrRuntimeInfo
    { 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void GetVersionString( 
            [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 1)] StringBuilder buffer, 
            [In, Out, MarshalAs(UnmanagedType.U4)] ref int bufferLength);
  
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void GetRuntimeDirectory(
            [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 1)] StringBuilder buffer,
            [In, Out, MarshalAs(UnmanagedType.U4)] ref int bufferLength); 
 
        [return: MarshalAs(UnmanagedType.Bool)] 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        bool IsLoaded(
            [In] IntPtr processHandle); 
 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), LCIDConversion(3)]
        void LoadErrorString(
            [In, MarshalAs(UnmanagedType.U4)] int resourceId, 
            [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 2)] StringBuilder buffer,
            [In, Out, MarshalAs(UnmanagedType.U4)] ref int bufferLength); 
  
        //@
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        IntPtr LoadLibrary(
            [In, MarshalAs(UnmanagedType.LPWStr)] string dllName);
 
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        IntPtr GetProcAddress(
            [In, MarshalAs(UnmanagedType.LPStr)] string procName); 
  
        [return: MarshalAs(UnmanagedType.Interface)]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
        object GetInterface(
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid coClassId,
            [In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceId);
    } 
}