Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / ComIntegration / EmitterCache.cs / 1 / EmitterCache.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.ComIntegration { using System; using System.Reflection; using System.Reflection.Emit; using System.Collections.Generic; using System.Threading; using System.Runtime.InteropServices; internal class EmitterCache { private static EmitterCache Provider = null; private static object initLock = new object (); internal static EmitterCache TypeEmitter { get { lock (initLock) { if (Provider == null) { EmitterCache localProvider = new EmitterCache(); Thread.MemoryBarrier(); Provider = localProvider; } } if (Provider == null) { DiagnosticUtility.DebugAssert("Provider should not be null"); #pragma warning suppress 56503 // throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(true); } return Provider; } } ModuleBuilder DynamicModule; AssemblyBuilder assemblyBuilder; DictionaryinterfaceToClassMap ; private EmitterCache () { AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = Guid.NewGuid().ToString (); assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); DynamicModule = assemblyBuilder.DefineDynamicModule (Guid.NewGuid().ToString () ); interfaceToClassMap = new Dictionary (); } private Type [] GetParameterTypes (MethodInfo mInfo) { ParameterInfo [] parameters = mInfo.GetParameters (); Type [] typeArray = new Type [parameters.Length ]; int index = 0; for (; index < parameters.Length; index++) { typeArray [index] = parameters [index].ParameterType ; } return typeArray; } internal Type FindOrCreateType (Type interfaceType) { if (!interfaceType.IsInterface) { DiagnosticUtility.DebugAssert("Passed in type should be an Interface"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false); } Type classType = null; lock(this) { interfaceToClassMap.TryGetValue (interfaceType, out classType); if (classType == null) { TypeBuilder typeBuilder = DynamicModule.DefineType(interfaceType.Name + "MarshalByRefObject", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Abstract, typeof(MarshalByRefObject), new Type[] { interfaceType }); Type[] ctorParams = new Type[] { typeof(ClassInterfaceType) }; ConstructorInfo classCtorInfo = typeof(ClassInterfaceAttribute).GetConstructor(ctorParams); CustomAttributeBuilder attributeBuilder = new CustomAttributeBuilder(classCtorInfo, new object[] { ClassInterfaceType.None }); typeBuilder.SetCustomAttribute(attributeBuilder); typeBuilder.AddInterfaceImplementation(interfaceType); foreach (MethodInfo mInfo in interfaceType.GetMethods()) { MethodBuilder methodInClass = null; methodInClass = typeBuilder.DefineMethod(mInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Abstract | MethodAttributes.Abstract | MethodAttributes.HideBySig | MethodAttributes.NewSlot, mInfo.ReturnType, GetParameterTypes(mInfo)); } classType = typeBuilder.CreateType(); interfaceToClassMap[interfaceType] = classType; } } if (classType == null) { DiagnosticUtility.DebugAssert("Class Type should not be null at this point"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false); } return classType; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LinkedList.cs
- InstanceHandleConflictException.cs
- SqlServices.cs
- XmlSchemaGroupRef.cs
- Evidence.cs
- FtpCachePolicyElement.cs
- RtfControls.cs
- FixUp.cs
- BindingMemberInfo.cs
- NumberFormatInfo.cs
- XmlMemberMapping.cs
- ActivityCodeDomReferenceService.cs
- TypedTableBaseExtensions.cs
- ImpersonateTokenRef.cs
- DesignerSerializationOptionsAttribute.cs
- MessageDispatch.cs
- PackageController.cs
- XmlName.cs
- ArcSegment.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- AutoSizeComboBox.cs
- MarkupExtensionSerializer.cs
- regiisutil.cs
- DetailsViewPagerRow.cs
- Knowncolors.cs
- CollectionChangedEventManager.cs
- DataGridViewCellStateChangedEventArgs.cs
- UrlMapping.cs
- HtmlTitle.cs
- HttpRuntime.cs
- TraceSection.cs
- DataFormat.cs
- RetriableClipboard.cs
- OrthographicCamera.cs
- ProcessModelSection.cs
- ConfigXmlElement.cs
- X509Chain.cs
- TabControlEvent.cs
- ProfilePropertySettings.cs
- sqlstateclientmanager.cs
- DiscoveryClientOutputChannel.cs
- ColorTransform.cs
- BrushConverter.cs
- SettingsBase.cs
- BinaryFormatterWriter.cs
- ServicesUtilities.cs
- FloatAverageAggregationOperator.cs
- ValidatingCollection.cs
- ObjectDataSourceView.cs
- PropertyBuilder.cs
- FormView.cs
- SystemMulticastIPAddressInformation.cs
- OracleInfoMessageEventArgs.cs
- ClientApiGenerator.cs
- HtmlInputSubmit.cs
- StrokeCollection.cs
- _HeaderInfoTable.cs
- IImplicitResourceProvider.cs
- TextElementEditingBehaviorAttribute.cs
- IndependentlyAnimatedPropertyMetadata.cs
- HttpConfigurationSystem.cs
- FormatConvertedBitmap.cs
- WindowInteropHelper.cs
- UrlPath.cs
- OdbcConnectionPoolProviderInfo.cs
- Compiler.cs
- StyleModeStack.cs
- DetailsViewRowCollection.cs
- SymbolEqualComparer.cs
- AbandonedMutexException.cs
- AssemblyNameProxy.cs
- NaturalLanguageHyphenator.cs
- WebEventCodes.cs
- BlockCollection.cs
- CommonProperties.cs
- Event.cs
- DynamicMethod.cs
- HttpModuleActionCollection.cs
- WsatServiceCertificate.cs
- IntSecurity.cs
- XmlConvert.cs
- OperationExecutionFault.cs
- SqlXml.cs
- DefaultTraceListener.cs
- TdsParserStaticMethods.cs
- IconBitmapDecoder.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- PropertyValueUIItem.cs
- Certificate.cs
- Message.cs
- Rect3DConverter.cs
- ButtonPopupAdapter.cs
- QueuePropertyVariants.cs
- RuntimeArgumentHandle.cs
- SymmetricKey.cs
- TextTreeTextElementNode.cs
- SystemResourceHost.cs
- GraphicsContext.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- StrongTypingException.cs