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
- HandlerBase.cs
- ManagementOperationWatcher.cs
- RegexWorker.cs
- ParallelTimeline.cs
- DbConnectionPool.cs
- ScriptingWebServicesSectionGroup.cs
- MachineKeySection.cs
- RIPEMD160.cs
- TraceHandler.cs
- XmlSchemaDocumentation.cs
- ConfigXmlText.cs
- PackageRelationshipCollection.cs
- XmlQueryContext.cs
- Char.cs
- PackageFilter.cs
- TagMapInfo.cs
- UnsafeNativeMethods.cs
- Matrix3DStack.cs
- NamedPipeAppDomainProtocolHandler.cs
- InteropTrackingRecord.cs
- XamlBuildProvider.cs
- PerfService.cs
- SafeEventLogReadHandle.cs
- SQLSingleStorage.cs
- ProcessThread.cs
- EndpointDiscoveryElement.cs
- CodeIndexerExpression.cs
- DateRangeEvent.cs
- IsolationInterop.cs
- LookupNode.cs
- BitmapFrameEncode.cs
- SystemException.cs
- HScrollProperties.cs
- ResolveCriteria.cs
- UrlAuthFailedErrorFormatter.cs
- ApplicationFileCodeDomTreeGenerator.cs
- RemoteWebConfigurationHostServer.cs
- SchemaTableColumn.cs
- WebPartDisplayModeEventArgs.cs
- DbQueryCommandTree.cs
- TriState.cs
- Expander.cs
- _Win32.cs
- NativeMethods.cs
- EventlogProvider.cs
- UInt64.cs
- ColumnHeader.cs
- ProvidersHelper.cs
- PopupRoot.cs
- X509SecurityTokenProvider.cs
- HttpVersion.cs
- SafePointer.cs
- SecuritySessionServerSettings.cs
- RTTypeWrapper.cs
- WmlCommandAdapter.cs
- DataGridViewTextBoxCell.cs
- XmlSchema.cs
- EventBuilder.cs
- ValidationErrorCollection.cs
- ElementMarkupObject.cs
- PeerNameRecordCollection.cs
- ScrollBar.cs
- TextCompositionManager.cs
- AutoScrollExpandMessageFilter.cs
- SynchronizationContext.cs
- XmlObjectSerializerWriteContext.cs
- LoggedException.cs
- x509utils.cs
- OrthographicCamera.cs
- Visual.cs
- ActiveXHelper.cs
- SuppressMessageAttribute.cs
- WebPartAddingEventArgs.cs
- DBSchemaRow.cs
- RenderDataDrawingContext.cs
- StylusEditingBehavior.cs
- QilParameter.cs
- webeventbuffer.cs
- PhysicalFontFamily.cs
- EventLogPermission.cs
- BaseValidatorDesigner.cs
- HttpListenerException.cs
- ListItemDetailViewAttribute.cs
- PeerNameRegistration.cs
- SafeBitVector32.cs
- SqlOuterApplyReducer.cs
- DocumentGrid.cs
- InfiniteIntConverter.cs
- TreeBuilderXamlTranslator.cs
- TextElementCollection.cs
- PinProtectionHelper.cs
- ColumnBinding.cs
- LocalTransaction.cs
- AstNode.cs
- RuntimeConfig.cs
- FactorySettingsElement.cs
- FilterUserControlBase.cs
- Vector3DValueSerializer.cs
- Line.cs
- XmlCodeExporter.cs