Exemplo n.º 1
0
 private static void ReleaseHelperInstance()
 {
     if (0 == Interlocked.Decrement(ref instanceCount))
     {
         instance = null;
     }
 }
Exemplo n.º 2
0
        internal static Assembly GenerateAssemblyFromNativeTypeLibrary(Guid iid, Guid typeLibraryID, ITypeLib typeLibrary)
        {
            TypeLibraryHelper helper = GetHelperInstance();

            try
            {
                return(helper.GenerateAssemblyFromNativeTypeLibInternal(iid, typeLibraryID, typeLibrary));
            }
            finally
            {
                ReleaseHelperInstance();
            }
        }
Exemplo n.º 3
0
 private static TypeLibraryHelper GetHelperInstance()
 {
     lock (instanceLock)
     {
         if (instance == null)
         {
             TypeLibraryHelper helper = new TypeLibraryHelper();
             Thread.MemoryBarrier();
             instance = helper;
         }
     }
     Interlocked.Increment(ref instanceCount);
     return(instance);
 }
        private static TypeLibraryHelper GetHelperInstance()
        {
            lock (instanceLock)
            {
                if (instance == null)
                {
                    TypeLibraryHelper tlhTemp = new TypeLibraryHelper();
                    Thread.MemoryBarrier();
                    instance = tlhTemp;
                }
            }

            Interlocked.Increment(ref instanceCount);
            return instance;
        }
Exemplo n.º 5
0
        internal static Assembly GenerateAssemblyFromNativeTypeLibrary(Guid iid, Guid typeLibraryID, ITypeLib typeLibrary)
        {
            Assembly          assembly;
            TypeLibraryHelper helperInstance = GetHelperInstance();

            try
            {
                assembly = helperInstance.GenerateAssemblyFromNativeTypeLibInternal(iid, typeLibraryID, typeLibrary);
            }
            finally
            {
                ReleaseHelperInstance();
            }
            return(assembly);
        }
Exemplo n.º 6
0
            Assembly ITypeLibImporterNotifySink.ResolveRef(object typeLib)
            {
                ITypeLib tlb = typeLib as ITypeLib;
                IntPtr   ptr = IntPtr.Zero;

                try
                {
                    tlb.GetLibAttr(out ptr);
                    System.Runtime.InteropServices.ComTypes.TYPELIBATTR attr = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(ptr, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
                    return(TypeLibraryHelper.GenerateAssemblyFromNativeTypeLibrary(iid, attr.guid, typeLib as ITypeLib));
                }
                finally
                {
                    if ((ptr != IntPtr.Zero) && (tlb != null))
                    {
                        tlb.ReleaseTLibAttr(ptr);
                    }
                }
            }
Exemplo n.º 7
0
            Assembly ITypeLibImporterNotifySink.ResolveRef(object typeLib)
            {
                Assembly assembly;
                ITypeLib lib  = typeLib as ITypeLib;
                IntPtr   zero = IntPtr.Zero;

                try
                {
                    lib.GetLibAttr(out zero);
                    System.Runtime.InteropServices.ComTypes.TYPELIBATTR typelibattr = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(zero, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
                    assembly = TypeLibraryHelper.GenerateAssemblyFromNativeTypeLibrary(this.iid, typelibattr.guid, typeLib as ITypeLib);
                }
                finally
                {
                    if ((zero != IntPtr.Zero) && (lib != null))
                    {
                        lib.ReleaseTLibAttr(zero);
                    }
                }
                return(assembly);
            }
 private static void ReleaseHelperInstance()
 {
     if (0 == Interlocked.Decrement(ref instanceCount))
         instance = null;
 }
        private Assembly ResolveAssemblyFromTypeLibID(Guid iid, Guid typeLibraryID, string version, bool noAssemblyGeneration)
        {
            Assembly assembly;

            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, 0x5000d, "TraceCodeComIntegrationTLBImportStarting", iid, typeLibraryID);
            bool      flag        = false;
            ITypeLib2 typeLibrary = null;

            try
            {
                lock (this.assemblyTableLock)
                {
                    this.assemblyTable.TryGetValue(typeLibraryID, out assembly);
                    if (assembly == null)
                    {
                        typeLibrary = this.GettypeLibrary(typeLibraryID, version);
                        object pVarVal = null;
                        typeLibrary.GetCustData(ref clrAssemblyCustomID, out pVarVal);
                        if (pVarVal == null)
                        {
                            flag = true;
                        }
                        string str = pVarVal as string;
                        if (string.IsNullOrEmpty(str))
                        {
                            flag = true;
                        }
                        if (noAssemblyGeneration && flag)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("NativeTypeLibraryNotAllowed", new object[] { typeLibraryID })));
                        }
                        if (!flag)
                        {
                            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, 0x5000e, "TraceCodeComIntegrationTLBImportFromAssembly", iid, typeLibraryID, str);
                            assembly = Assembly.Load(str);
                        }
                        else
                        {
                            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, 0x5000f, "TraceCodeComIntegrationTLBImportFromTypelib", iid, typeLibraryID);
                            assembly = TypeLibraryHelper.GenerateAssemblyFromNativeTypeLibrary(iid, typeLibraryID, typeLibrary);
                        }
                        this.assemblyTable[typeLibraryID] = assembly;
                    }
                }
            }
            catch (Exception exception)
            {
                DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, EventLogCategory.ComPlus, (EventLogEventId)(-1073610728), new string[] { iid.ToString(), typeLibraryID.ToString(), exception.ToString() });
                throw;
            }
            finally
            {
                if (typeLibrary != null)
                {
                    Marshal.ReleaseComObject(typeLibrary);
                }
            }
            if (null == assembly)
            {
                throw Fx.AssertAndThrow("Assembly should not be null");
            }
            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, 0x50011, "TraceCodeComIntegrationTLBImportFinished", iid, typeLibraryID);
            return(assembly);
        }
        private Assembly ResolveAssemblyFromTypeLibID(Guid iid, Guid typeLibraryID, string version, bool parseVersionAsHex, bool noAssemblyGeneration)
        {
            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationTLBImportStarting,
                                        SR.TraceCodeComIntegrationTLBImportStarting, iid, typeLibraryID);
            Assembly asm;

            bool      generateNativeAssembly = false;
            ITypeLib2 typeLibrary            = null;

            try
            {
                lock (assemblyTableLock)
                {
                    assemblyTable.TryGetValue(typeLibraryID, out asm);
                    if (asm == null)
                    {
                        typeLibrary = GettypeLibrary(typeLibraryID, version, parseVersionAsHex);
                        object opaqueData = null;
                        typeLibrary.GetCustData(ref clrAssemblyCustomID, out opaqueData);
                        if (opaqueData == null)
                        {
                            generateNativeAssembly = true;      // No custom data for this IID this is not a CLR typeLibrary
                        }
                        String assembly = opaqueData as String;
                        if (String.IsNullOrEmpty(assembly))
                        {
                            generateNativeAssembly = true;      // No custom data for this IID this is not a CLR typeLibrary
                        }
                        if (noAssemblyGeneration && generateNativeAssembly)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.NativeTypeLibraryNotAllowed, typeLibraryID)));
                        }
                        else if (!generateNativeAssembly)
                        {
                            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationTLBImportFromAssembly,
                                                        SR.TraceCodeComIntegrationTLBImportFromAssembly, iid, typeLibraryID, assembly);
                            asm = Assembly.Load(assembly);            // Assembly.Load will get a full assembly name
                        }
                        else
                        {
                            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationTLBImportFromTypelib,
                                                        SR.TraceCodeComIntegrationTLBImportFromTypelib, iid, typeLibraryID);
                            asm = TypeLibraryHelper.GenerateAssemblyFromNativeTypeLibrary(iid, typeLibraryID, typeLibrary as ITypeLib);
                        }

                        assemblyTable[typeLibraryID] = asm;
                    }
                }
            }
            catch (Exception e)
            {
                DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error,
                                                    (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus,
                                                    (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusTLBImportError,
                                                    iid.ToString(),
                                                    typeLibraryID.ToString(),
                                                    e.ToString());
                throw;
            }
            finally
            {
                // Add Try Finally to cleanup typeLibrary
                if (typeLibrary != null)
                {
                    Marshal.ReleaseComObject((object)typeLibrary);
                }
            }

            if (null == asm)
            {
                throw Fx.AssertAndThrow("Assembly should not be null");
            }
            ComPlusTLBImportTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationTLBImportFinished,
                                        SR.TraceCodeComIntegrationTLBImportFinished, iid, typeLibraryID);
            return(asm);
        }