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
- GPStream.cs
- IisTraceWebEventProvider.cs
- CreateUserWizardStep.cs
- PageThemeBuildProvider.cs
- IndexedSelectQueryOperator.cs
- ColumnHeaderConverter.cs
- PKCS1MaskGenerationMethod.cs
- DataSourceSelectArguments.cs
- RealProxy.cs
- EventLogTraceListener.cs
- _NegotiateClient.cs
- ComponentEvent.cs
- Ops.cs
- LogicalTreeHelper.cs
- DataGridAddNewRow.cs
- PolyQuadraticBezierSegment.cs
- OptimisticConcurrencyException.cs
- backend.cs
- OperationCanceledException.cs
- InputScope.cs
- StrongNameIdentityPermission.cs
- TextTreeTextBlock.cs
- ValueQuery.cs
- BooleanProjectedSlot.cs
- DaylightTime.cs
- SafeRightsManagementSessionHandle.cs
- SqlMethodTransformer.cs
- XamlSerializerUtil.cs
- SimpleFileLog.cs
- XmlILIndex.cs
- UrlPath.cs
- StaticContext.cs
- VersionPair.cs
- SystemIcons.cs
- XPathNavigatorKeyComparer.cs
- LoginAutoFormat.cs
- ReverseInheritProperty.cs
- UpdateExpressionVisitor.cs
- Peer.cs
- PageBuildProvider.cs
- OleDbWrapper.cs
- Part.cs
- ExpressionEditor.cs
- TreeViewBindingsEditor.cs
- EntitySetDataBindingList.cs
- ObjectCloneHelper.cs
- BinaryConverter.cs
- _ConnectOverlappedAsyncResult.cs
- IDReferencePropertyAttribute.cs
- UrlPath.cs
- NodeCounter.cs
- ProgressBar.cs
- TableProviderWrapper.cs
- HttpSysSettings.cs
- LabelDesigner.cs
- CheckBoxBaseAdapter.cs
- FileRegion.cs
- AsymmetricKeyExchangeDeformatter.cs
- ToolboxItemCollection.cs
- ContainerTracking.cs
- ObjectDataSourceDisposingEventArgs.cs
- CallbackException.cs
- PreviewPrintController.cs
- ButtonFlatAdapter.cs
- BindingCompleteEventArgs.cs
- UInt32Converter.cs
- _HeaderInfo.cs
- ObjectPropertyMapping.cs
- SegmentInfo.cs
- MsmqMessageProperty.cs
- FormViewUpdatedEventArgs.cs
- SchemaRegistration.cs
- GradientSpreadMethodValidation.cs
- CodeTypeReference.cs
- PropertyValue.cs
- ListViewUpdateEventArgs.cs
- QueryTaskGroupState.cs
- ParameterBuilder.cs
- RawStylusInputCustomData.cs
- ImageMapEventArgs.cs
- WindowsListViewItemStartMenu.cs
- InkSerializer.cs
- Brushes.cs
- Condition.cs
- precedingquery.cs
- Metafile.cs
- Configuration.cs
- TextCompositionEventArgs.cs
- OutputCacheModule.cs
- EntityDataSourceContextDisposingEventArgs.cs
- OleDbDataAdapter.cs
- TransformGroup.cs
- HealthMonitoringSectionHelper.cs
- WebPartMinimizeVerb.cs
- HttpCacheVaryByContentEncodings.cs
- HttpCapabilitiesEvaluator.cs
- XmlQueryOutput.cs
- AdapterDictionary.cs
- __ComObject.cs
- CodeChecksumPragma.cs