private static void ReleaseHelperInstance() { if (0 == Interlocked.Decrement(ref instanceCount)) { instance = null; } }
internal static Assembly GenerateAssemblyFromNativeTypeLibrary(Guid iid, Guid typeLibraryID, ITypeLib typeLibrary) { TypeLibraryHelper helper = GetHelperInstance(); try { return(helper.GenerateAssemblyFromNativeTypeLibInternal(iid, typeLibraryID, typeLibrary)); } finally { ReleaseHelperInstance(); } }
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; }
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); }
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); } } }
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); }