FusionWrap.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / Microsoft / Win32 / FusionWrap.cs / 1 / FusionWrap.cs

                            // ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
//--------------------------------------------------------------
// FusionInterfaces.cs 
// 
// This implements wrappers to Fusion interfaces
//------------------------------------------------------------- 
namespace Microsoft.Win32
{
    using System;
    using System.IO; 
    using System.Collections;
    using System.Runtime.InteropServices; 
    using System.Runtime.CompilerServices; 
    using System.Globalization;
    using StringBuilder = System.Text.StringBuilder; 
#if !FEATURE_COMINTEROP
    using Microsoft.Win32.SafeHandles;
#endif // !FEATURE_COMINTEROP
 

#if FEATURE_COMINTEROP 
    //------------------------------------------------------------- 
    // Interfaces defined by fusion
    //------------------------------------------------------------- 
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("21b8916c-f28e-11d2-a473-00c04f8ef448")]
    interface IAssemblyEnum
    {
        [PreserveSig()] 
        int GetNextAssembly(out IApplicationContext ppAppCtx, out IAssemblyName ppName, uint dwFlags);
        [PreserveSig()] 
        int Reset(); 
        [PreserveSig()]
        int Clone(out IAssemblyEnum ppEnum); 
    }

    [ComImport,InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7c23ff90-33af-11d3-95da-00a024a85b51")]
    interface IApplicationContext 
    {
        void SetContextNameObject(IAssemblyName pName); 
        void GetContextNameObject(out IAssemblyName ppName); 
        void Set([MarshalAs(UnmanagedType.LPWStr)] String szName, int pvValue, uint cbValue, uint dwFlags);
        void Get([MarshalAs(UnmanagedType.LPWStr)] String szName, out int pvValue, ref uint pcbValue, uint dwFlags); 
        void GetDynamicDirectory(out int wzDynamicDir, ref uint pdwSize);
    }

 
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("CD193BC0-B4BC-11d2-9833-00C04FC31D2E")]
    interface IAssemblyName 
    { 
        [PreserveSig()]
        int SetProperty(uint PropertyId, IntPtr pvProperty, uint cbProperty); 
        [PreserveSig()]
        int GetProperty(uint PropertyId, IntPtr pvProperty, ref uint pcbProperty);
        [PreserveSig()]
        int Finalize(); 
        [PreserveSig()]
        int GetDisplayName(IntPtr szDisplayName, ref uint pccDisplayName, uint dwDisplayFlags); 
        [PreserveSig()] 
        int BindToObject(Object /*REFIID*/ refIID,
                         Object /*IAssemblyBindSink*/ pAsmBindSink, 
                         IApplicationContext pApplicationContext,
                         [MarshalAs(UnmanagedType.LPWStr)] String szCodeBase,
                         Int64 llFlags,
                         int pvReserved, 
                         uint cbReserved,
                         out int ppv); 
        [PreserveSig()] 
        int GetName(out uint lpcwBuffer, out int pwzName);
        [PreserveSig()] 
        int GetVersion(out uint pdwVersionHi, out uint pdwVersionLow);
        [PreserveSig()]
        int IsEqual(IAssemblyName pName, uint dwCmpFlags);
        [PreserveSig()] 
        int Clone(out IAssemblyName pName);
    } 
#endif // FEATURE_COMINTEROP 

    internal static class ASM_CACHE 
    {
         public const uint ZAP          = 0x1;
         public const uint GAC          = 0x2;
         public const uint DOWNLOAD     = 0x4; 
    }
 
    internal static class CANOF 
    {
        public const uint PARSE_DISPLAY_NAME = 0x1; 
        public const uint SET_DEFAULT_VALUES = 0x2;
    }

    internal static class ASM_NAME 
    {
         public const uint PUBLIC_KEY            = 0; 
         public const uint PUBLIC_KEY_TOKEN      = PUBLIC_KEY + 1; 
         public const uint HASH_VALUE            = PUBLIC_KEY_TOKEN + 1;
         public const uint NAME                  = HASH_VALUE + 1; 
         public const uint MAJOR_VERSION         = NAME + 1;
         public const uint MINOR_VERSION         = MAJOR_VERSION + 1;
         public const uint BUILD_NUMBER          = MINOR_VERSION + 1;
         public const uint REVISION_NUMBER       = BUILD_NUMBER + 1; 
         public const uint CULTURE               = REVISION_NUMBER + 1;
         public const uint PROCESSOR_ID_ARRAY    = CULTURE + 1; 
         public const uint OSINFO_ARRAY          = PROCESSOR_ID_ARRAY + 1; 
         public const uint HASH_ALGID            = OSINFO_ARRAY + 1;
         public const uint ALIAS                 = HASH_ALGID + 1; 
         public const uint CODEBASE_URL          = ALIAS + 1;
         public const uint CODEBASE_LASTMOD      = CODEBASE_URL + 1;
         public const uint NULL_PUBLIC_KEY       = CODEBASE_LASTMOD + 1;
         public const uint NULL_PUBLIC_KEY_TOKEN  = NULL_PUBLIC_KEY + 1; 
         public const uint CUSTOM                = NULL_PUBLIC_KEY_TOKEN + 1;
         public const uint NULL_CUSTOM           = CUSTOM + 1; 
         public const uint MVID                  = NULL_CUSTOM + 1; 
         public const uint _32_BIT_ONLY          = MVID + 1;
         public const uint MAX_PARAMS            = _32_BIT_ONLY + 1; 
    }

    internal static class Fusion
    { /* SSS_WARNINGS_OFF */ 
        public static void ReadCache(ArrayList alAssems, String name, uint nFlag)
        { /* SSS_WARNINGS_ON */ 
#if FEATURE_COMINTEROP 
            IAssemblyEnum   aEnum       = null;
            IAssemblyName   aName       = null; 
            IAssemblyName   aNameEnum   = null;
            IApplicationContext AppCtx  = null;
#else // FEATURE_COMINTEROP
            SafeFusionHandle aEnum      = null; 
            SafeFusionHandle aNameEnum  = null;
            SafeFusionHandle AppCtx     = SafeFusionHandle.InvalidHandle; 
#endif // FEATURE_COMINTEROP 
            int hr;
 
            if (name != null) {
                hr = Win32Native.CreateAssemblyNameObject(out aNameEnum, name, CANOF.PARSE_DISPLAY_NAME, IntPtr.Zero);
                if (hr != 0)
                    Marshal.ThrowExceptionForHR(hr); 
            }
 
#if !FEATURE_COMINTEROP 
            using (aNameEnum) {
#endif // !FEATURE_COMINTEROP 

                hr = Win32Native.CreateAssemblyEnum(out aEnum, AppCtx, aNameEnum, nFlag, IntPtr.Zero);
                if (hr != 0)
                    Marshal.ThrowExceptionForHR(hr); 

#if FEATURE_COMINTEROP 
                for (;;) 
                {
                    hr = aEnum.GetNextAssembly(out AppCtx, out aName, 0); 
                    if (hr != 0) {
                        if (hr < 0)
                            Marshal.ThrowExceptionForHR(hr);
                        break; 
                    }
#else // FEATURE_COMINTEROP 
                using (aEnum) { 

                    for (;;) using (SafeFusionHandle aAppCtx = new SafeFusionHandle(), aName = new SafeFusionHandle()) 
                    {
                        if (!GetNextAssembly(aEnum, aAppCtx, aName, 0))
                            break;
#endif // FEATURE_COMINTEROP 

                        String sDisplayName = GetDisplayName(aName, 0); 
                        if (sDisplayName == null) 
                            continue;
/* SSS_WARNINGS_OFF */ 
                        alAssems.Add(sDisplayName);
/* SSS_WARNINGS_ON */                    }

#if !FEATURE_COMINTEROP 
                } // using (aEnum)
            } // using (aNameEnum) 
#endif // !FEATURE_COMINTEROP 
        }
 
#if FEATURE_COMINTEROP
        static unsafe String GetDisplayName(IAssemblyName aName, uint dwDisplayFlags)
        {
            uint iLen=0; 
            String sDisplayName = null;
 
            aName.GetDisplayName((IntPtr)0, ref iLen, dwDisplayFlags); 
            if (iLen > 0) {
                IntPtr pDisplayName=(IntPtr)0; 

                // Do some yucky memory allocating here
                // We need to assume that a wide character is 2 bytes.
                byte[] data = new byte[((int)iLen+1)*2]; 
                fixed (byte *dataptr = data) {
                    pDisplayName = new IntPtr((void *) dataptr); 
                    aName.GetDisplayName(pDisplayName, ref iLen, dwDisplayFlags); 
                    sDisplayName = Marshal.PtrToStringUni(pDisplayName);
                } 
            }

            return sDisplayName;
        } 

#else // FEATURE_COMINTEROP 
 
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        static extern bool GetNextAssembly(SafeFusionHandle pEnum, SafeFusionHandle pAppCtx, SafeFusionHandle pName, uint dwFlags); 

        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        static extern String GetDisplayName(SafeFusionHandle pName, uint dwDisplayFlags);
 
#endif // FEATURE_COMINTEROP
    } 
}
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK