Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / Serialization / Compiler.cs / 1305376 / Compiler.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.Serialization { using System.Reflection; using System.Reflection.Emit; using System.Collections; using System.IO; using System; using System.Text; using System.ComponentModel; using System.CodeDom.Compiler; using System.Security; using System.Security.Permissions; using System.Diagnostics; using System.Security.Principal; using System.Security.Policy; using System.Threading; using System.Xml.Serialization.Configuration; using System.Globalization; using System.Runtime.Versioning; using System.Runtime.CompilerServices; internal class Compiler { bool debugEnabled = DiagnosticsSwitches.KeepTempFiles.Enabled; Hashtable imports = new Hashtable(); StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); [ResourceExposure(ResourceScope.Machine)] protected string[] Imports { get { string[] array = new string[imports.Values.Count]; imports.Values.CopyTo(array, 0); return array; } } // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] [ResourceExposure(ResourceScope.None)] internal void AddImport(Type type, Hashtable types) { if (type == null) return; if (TypeScope.IsKnownType(type)) return; if (types[type] != null) return; types[type] = type; Type baseType = type.BaseType; if (baseType != null) AddImport(baseType, types); Type declaringType = type.DeclaringType; if (declaringType != null) AddImport(declaringType, types); foreach (Type intf in type.GetInterfaces()) AddImport(intf, types); ConstructorInfo[] ctors = type.GetConstructors(); for (int i = 0; i < ctors.Length; i++) { ParameterInfo[] parms = ctors[i].GetParameters(); for (int j = 0; j < parms.Length; j++) { AddImport(parms[j].ParameterType, types); } } if (type.IsGenericType) { Type[] arguments = type.GetGenericArguments(); for (int i = 0; i < arguments.Length; i++) { AddImport(arguments[i], types); } } TempAssembly.FileIOPermission.Assert(); Module module = type.Module; Assembly assembly = module.Assembly; if (DynamicAssemblies.IsTypeDynamic(type)) { DynamicAssemblies.Add(assembly); return; } object[] typeForwardedFromAttribute = type.GetCustomAttributes(typeof(TypeForwardedFromAttribute), false); if (typeForwardedFromAttribute.Length > 0) { TypeForwardedFromAttribute originalAssemblyInfo = typeForwardedFromAttribute[0] as TypeForwardedFromAttribute; Assembly originalAssembly = Assembly.Load(originalAssemblyInfo.AssemblyFullName); imports[originalAssembly] = originalAssembly.Location; } imports[assembly] = assembly.Location; } // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] [ResourceExposure(ResourceScope.None)] internal void AddImport(Assembly assembly) { TempAssembly.FileIOPermission.Assert(); imports[assembly] = assembly.Location; } internal TextWriter Source { get { return writer; } } internal void Close() { } [ResourceConsumption(ResourceScope.Machine)] [ResourceExposure(ResourceScope.Machine)] internal static string GetTempAssemblyPath(string baseDir, Assembly assembly, string defaultNamespace) { if (assembly.IsDynamic) { throw new InvalidOperationException(Res.GetString(Res.XmlPregenAssemblyDynamic)); } PermissionSet perms = new PermissionSet(PermissionState.None); perms.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); perms.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted)); perms.Assert(); try { if (baseDir != null && baseDir.Length > 0) { // check that the dirsctory exists if (!Directory.Exists(baseDir)) { throw new UnauthorizedAccessException(Res.GetString(Res.XmlPregenMissingDirectory, baseDir)); } } else { baseDir = Path.GetTempPath(); // check that the dirsctory exists if (!Directory.Exists(baseDir)) { throw new UnauthorizedAccessException(Res.GetString(Res.XmlPregenMissingTempDirectory)); } } if (baseDir.EndsWith("\\", StringComparison.Ordinal)) baseDir += GetTempAssemblyName(assembly.GetName(), defaultNamespace); else baseDir += "\\" + GetTempAssemblyName(assembly.GetName(), defaultNamespace); } finally { CodeAccessPermission.RevertAssert(); } return baseDir + ".dll"; } internal static string GetTempAssemblyName(AssemblyName parent, string ns) { return parent.Name + ".XmlSerializers" + (ns == null || ns.Length == 0 ? "" : "." + ns.GetHashCode()); } // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] [ResourceExposure(ResourceScope.None)] internal Assembly Compile(Assembly parent, string ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) { CodeDomProvider codeProvider = new Microsoft.CSharp.CSharpCodeProvider(); CompilerParameters parameters = xmlParameters.CodeDomParameters; parameters.ReferencedAssemblies.AddRange(Imports); if (debugEnabled) { parameters.GenerateInMemory = false; parameters.IncludeDebugInformation = true; parameters.TempFiles.KeepFiles = true; } PermissionSet perms = new PermissionSet(PermissionState.None); if (xmlParameters.IsNeedTempDirAccess) { perms.AddPermission(TempAssembly.FileIOPermission); } perms.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted)); perms.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); perms.AddPermission(new SecurityPermission(SecurityPermissionFlag.ControlEvidence)); perms.Assert(); if (parent != null && (parameters.OutputAssembly == null || parameters.OutputAssembly.Length ==0)) { string assemblyName = AssemblyNameFromOptions(parameters.CompilerOptions); if (assemblyName == null) assemblyName = GetTempAssemblyPath(parameters.TempFiles.TempDir, parent, ns); // parameters.OutputAssembly = assemblyName; } if (parameters.CompilerOptions == null || parameters.CompilerOptions.Length == 0) parameters.CompilerOptions = "/nostdlib"; else parameters.CompilerOptions += " /nostdlib"; parameters.CompilerOptions += " /D:_DYNAMIC_XMLSERIALIZER_COMPILATION"; #pragma warning disable 618 parameters.Evidence = evidence; #pragma warning restore 618 CompilerResults results = null; Assembly assembly = null; try { results = codeProvider.CompileAssemblyFromSource(parameters, writer.ToString()); // check the output for errors or a certain level-1 warning (1595) if (results.Errors.Count > 0) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); stringWriter.WriteLine(Res.GetString(Res.XmlCompilerError, results.NativeCompilerReturnValue.ToString(CultureInfo.InvariantCulture))); bool foundOne = false; foreach (CompilerError e in results.Errors) { // clear filename. This makes ToString() print just error number and message. e.FileName = ""; if (!e.IsWarning || e.ErrorNumber == "CS1595") { foundOne = true; stringWriter.WriteLine(e.ToString()); } } if (foundOne) { throw new InvalidOperationException(stringWriter.ToString()); } } assembly = results.CompiledAssembly; } catch (UnauthorizedAccessException) { // try to get the user token string user = GetCurrentUser(); if (user == null || user.Length == 0) { throw new UnauthorizedAccessException(Res.GetString(Res.XmlSerializerAccessDenied)); } else { throw new UnauthorizedAccessException(Res.GetString(Res.XmlIdentityAccessDenied, user)); } } catch (FileLoadException fle) { throw new InvalidOperationException(Res.GetString(Res.XmlSerializerCompileFailed), fle); } finally { CodeAccessPermission.RevertAssert(); } // somehow we got here without generating an assembly if (assembly == null) throw new InvalidOperationException(Res.GetString(Res.XmlInternalError)); return assembly; } static string AssemblyNameFromOptions(string options) { if (options == null || options.Length == 0) return null; string outName = null; string[] flags = options.ToLower(CultureInfo.InvariantCulture).Split(null); for (int i = 0; i < flags.Length; i++) { string val = flags[i].Trim(); if (val.StartsWith("/out:", StringComparison.Ordinal)) { outName = val.Substring(5); } } return outName; } internal static string GetCurrentUser() { #if !FEATURE_PAL try { WindowsIdentity id = WindowsIdentity.GetCurrent(); if (id != null && id.Name != null) return id.Name; } catch (Exception e) { if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException) { throw; } } #endif // !FEATURE_PAL return ""; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CacheOutputQuery.cs
- FreezableOperations.cs
- RichTextBoxAutomationPeer.cs
- ComponentSerializationService.cs
- ProcessingInstructionAction.cs
- FeedUtils.cs
- UndirectedGraph.cs
- BehaviorEditorPart.cs
- TagPrefixCollection.cs
- DefaultValueTypeConverter.cs
- WindowsProgressbar.cs
- CodeCatchClause.cs
- DataGridViewControlCollection.cs
- NGCSerializerAsync.cs
- BitmapEffectGeneralTransform.cs
- GraphicsContext.cs
- Timer.cs
- BaseDataBoundControl.cs
- SelfIssuedTokenFactoryCredential.cs
- NetNamedPipeBinding.cs
- CapacityStreamGeometryContext.cs
- QueueAccessMode.cs
- SpAudioStreamWrapper.cs
- SmtpLoginAuthenticationModule.cs
- ToolStripPanelSelectionGlyph.cs
- CompatibleComparer.cs
- dsa.cs
- VersionPair.cs
- DesignerAdRotatorAdapter.cs
- DesignerVerbCollection.cs
- SHA512Managed.cs
- TrackBar.cs
- WindowsListViewItem.cs
- LinqToSqlWrapper.cs
- FileLoadException.cs
- HostingEnvironmentSection.cs
- DataPagerField.cs
- HwndHostAutomationPeer.cs
- BorderGapMaskConverter.cs
- BinaryCommonClasses.cs
- parserscommon.cs
- ErasingStroke.cs
- Component.cs
- PropertyGridEditorPart.cs
- FlatButtonAppearance.cs
- DatagridviewDisplayedBandsData.cs
- cookie.cs
- InvalidEnumArgumentException.cs
- Function.cs
- HtmlTableCell.cs
- MenuItem.cs
- AspNetCompatibilityRequirementsAttribute.cs
- PropertyRef.cs
- TableAutomationPeer.cs
- EventSchemaTraceListener.cs
- FixedSOMLineRanges.cs
- SecurityHelper.cs
- ListViewItemSelectionChangedEvent.cs
- ClockGroup.cs
- TextContainerChangeEventArgs.cs
- AmbiguousMatchException.cs
- CompoundFileIOPermission.cs
- ShapeTypeface.cs
- ZipIOLocalFileDataDescriptor.cs
- EndpointAddressMessageFilterTable.cs
- MimeMapping.cs
- MethodBody.cs
- HttpStaticObjectsCollectionBase.cs
- SessionPageStateSection.cs
- OutputCacheSection.cs
- Model3DCollection.cs
- JsonClassDataContract.cs
- ClientFormsAuthenticationMembershipProvider.cs
- GPRECT.cs
- ActiveXHelper.cs
- XmlSchemaInfo.cs
- TransformerInfoCollection.cs
- Psha1DerivedKeyGenerator.cs
- InstalledFontCollection.cs
- _HeaderInfoTable.cs
- ReaderWriterLock.cs
- MailBnfHelper.cs
- PathFigure.cs
- IriParsingElement.cs
- PropertyEmitterBase.cs
- SqlPersistenceWorkflowInstanceDescription.cs
- EntityContainerAssociationSetEnd.cs
- ReliableChannelListener.cs
- SafeHandle.cs
- ColumnBinding.cs
- Color.cs
- RealProxy.cs
- ChannelServices.cs
- QueueAccessMode.cs
- TranslateTransform3D.cs
- ParseElementCollection.cs
- UnknownBitmapEncoder.cs
- GeneralTransform3DGroup.cs
- ToolStripPanelRow.cs
- CriticalExceptions.cs