Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / XamlBuildTask / Microsoft / Build / Tasks / Xaml / XamlBuildTaskServices.cs / 1407647 / XamlBuildTaskServices.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace Microsoft.Build.Tasks.Xaml
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Security;
using System.Xaml;
using System.Xaml.Schema;
using System.Xml;
using System.Xml.Linq;
using Microsoft.Build.Utilities;
using System.Reflection;
using System.Globalization;
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
using System.CodeDom;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Linq;
internal static class XamlBuildTaskServices
{
internal const string ClrNamespaceUriNamespacePart = "clr-namespace:";
internal const string ClrNamespaceUriAssemblyPart = "assembly=";
internal const string XamlExtension = ".xaml";
//internal static XName SchemaTypeName = XamlSchemaTypeResolver.Default.GetTypeReference(typeof(SchemaType)).Name;
const string UnknownExceptionErrorCode = "XC1000";
// Update this value if any changes are made to it in System.Xaml\KnownStrings.cs
const string serializerReferenceNamePrefix = "__ReferenceID";
internal static string SerializerReferenceNamePrefix
{ get { return serializerReferenceNamePrefix; } }
static string _private = String.Empty;
internal static string PrivateModifier
{ get { return _private; } }
static string _public = String.Empty;
internal static string PublicModifier
{ get { return _public; } }
static string _internal = String.Empty;
internal static string InternalModifier
{ get { return _internal; } }
static string _protected = String.Empty;
internal static string ProtectedModifier
{ get { return _protected; } }
static string _protectedInternal = String.Empty;
internal static string ProtectedInternalModifier
{ get { return _protectedInternal; } }
static string _protectedAndInternal = String.Empty;
internal static string ProtectedAndInternalModifier
{ get { return _protectedAndInternal; } }
static string _publicClass = String.Empty;
internal static string PublicClassModifier
{ get { return _publicClass; } }
static string _internalClass = String.Empty;
internal static string InternalClassModifier
{ get { return _internalClass; } }
static string _fileNotLoaded = String.Empty;
internal static string FileNotLoaded
{
get { return _fileNotLoaded; }
}
internal static void PopulateModifiers(CodeDomProvider codeDomProvider)
{
TypeConverter memberAttributesConverter = codeDomProvider.GetConverter(typeof(MemberAttributes));
if (memberAttributesConverter != null)
{
if (memberAttributesConverter.CanConvertTo(typeof(string)))
{
try
{
_private = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Private).ToUpperInvariant();
_public = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Public).ToUpperInvariant();
_protected = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Family).ToUpperInvariant();
_internal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Assembly).ToUpperInvariant();
_protectedInternal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.FamilyOrAssembly).ToUpperInvariant();
_protectedAndInternal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.FamilyAndAssembly).ToUpperInvariant();
}
catch (NotSupportedException)
{
}
}
}
TypeConverter typeAttributesConverter = codeDomProvider.GetConverter(typeof(TypeAttributes));
if (typeAttributesConverter != null)
{
if (typeAttributesConverter.CanConvertTo(typeof(string)))
{
try
{
_internalClass = typeAttributesConverter.ConvertToInvariantString(TypeAttributes.NotPublic).ToUpperInvariant();
_publicClass = typeAttributesConverter.ConvertToInvariantString(TypeAttributes.Public).ToUpperInvariant();
}
catch (NotSupportedException)
{
}
}
}
}
public static Assembly ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
string[] parts = args.Name.Split(',');
foreach (var asm in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
{
AssemblyName assemblyName = asm.GetName();
if (assemblyName.Name.Equals(parts[0], StringComparison.OrdinalIgnoreCase))
{
return asm;
}
}
// The fact that the file can not be found in the referenced assembly list means that
// CLR will throw a FileLoadException once this event handler returns.
// Since the FileLoadException's FileName property is set to null (due to the fact there is no path),
// we are storing it in a static variable so that we can print a pretty error message later on.
_fileNotLoaded = args.Name;
return null;
}
public static AppDomain CreateAppDomain(string friendlyName, string buildTaskPath)
{
if (buildTaskPath == null)
{
throw FxTrace.Exception.AsError(new LoggedException(new InvalidOperationException(SR.BuildTaskPathMustNotBeNull)));
}
// Enable shadow copying in the Designer appdomain, so that we can continue to rebuild
// projects in the solution even if designer has loaded the assemblies that were referenced in current project
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ShadowCopyFiles = "true";
appDomainSetup.ApplicationBase = buildTaskPath;
appDomainSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
// Create appdomain with fulltrust.
return AppDomain.CreateDomain(
friendlyName,
AppDomain.CurrentDomain.Evidence,
appDomainSetup,
new NamedPermissionSet("FullTrust"));
}
internal static IList Load(IList references)
{
IList assemblies = new List();
foreach (var item in references)
{
assemblies.Add(Load(item));
}
bool mscorlibFound = false;
foreach (Assembly asm in assemblies)
{
// here we want to check if the assembly is mscorlib.dll.
// for the current codebase, this check would have worked:
// if (asm == typeof(Object).Assembly), but we
// prefer a check that will continue to work when LMR is used
if (asm.GetReferencedAssemblies().Length == 0)
{
mscorlibFound = true;
}
}
if (!mscorlibFound)
{
assemblies.Add(typeof(Object).Assembly);
}
return assemblies;
}
[SuppressMessage(FxCop.Category.Reliability, FxCop.Rule.AvoidCallingProblematicMethods,
Justification = "Using LoadFile to avoid loading through Fusion and load the exact assembly the developer specified")]
internal static Assembly Load(string reference)
{
if (reference.EndsWith("mscorlib.dll", StringComparison.OrdinalIgnoreCase))
{
return typeof(Object).Assembly;
}
string fullPath = Path.GetFullPath(reference);
try
{
return Assembly.ReflectionOnlyLoadFrom(fullPath);
}
catch (FileNotFoundException e)
{
if (e.FileName == null)
{
throw FxTrace.Exception.AsError((new FileNotFoundException(e.Message, fullPath)));
}
else
throw;
}
}
internal static void LogException(Task task, string message)
{
LogException(task, message, null, 0, 0);
}
internal static void LogException(Task task, string message, string fileName, int lineNumber, int linePosition)
{
string errorCode, logMessage;
ExtractErrorCodeAndMessage(task, message, out errorCode, out logMessage);
task.Log.LogError(null, errorCode, null, fileName, lineNumber, linePosition, 0, 0, logMessage, null);
}
static void ExtractErrorCodeAndMessage(Task task, string message, out string errorCode, out string logMessage)
{
errorCode = task.Log.ExtractMessageCode(message, out logMessage);
if (string.IsNullOrEmpty(errorCode))
{
errorCode = UnknownExceptionErrorCode;
logMessage = SR.UnknownBuildError(message);
}
}
internal static bool IsClrNamespaceUri(string nsName, out int nsIndex, out int assemblyIndex)
{
if (nsName.StartsWith(ClrNamespaceUriNamespacePart, StringComparison.Ordinal))
{
int semicolonIndex = nsName.IndexOf(';');
if (semicolonIndex == -1 || nsName.Trim().EndsWith(";", StringComparison.Ordinal))
{
nsIndex = ClrNamespaceUriNamespacePart.Length;
assemblyIndex = -1;
return true;
}
else
{
int equalsIndex = nsName.IndexOf('=', semicolonIndex);
if (equalsIndex != -1)
{
int start = ClrNamespaceUriNamespacePart.Length;
int assemblyStart = semicolonIndex + 1;
if (equalsIndex - semicolonIndex == ClrNamespaceUriAssemblyPart.Length)
{
for (int i = 0; i < ClrNamespaceUriAssemblyPart.Length; i++)
{
if (nsName[assemblyStart + i] != ClrNamespaceUriAssemblyPart[i])
{
nsIndex = -1;
assemblyIndex = -1;
return false;
}
}
nsIndex = start;
assemblyIndex = assemblyStart + ClrNamespaceUriAssemblyPart.Length;
return true;
}
}
}
}
nsIndex = -1;
assemblyIndex = -1;
return false;
}
internal static string UpdateClrNamespaceUriWithLocalAssembly(string @namespace, string localAssemblyName)
{
return UpdateClrNamespaceUriWithLocalAssembly(@namespace, localAssemblyName, null);
}
internal static string UpdateClrNamespaceUriWithLocalAssembly(string @namespace, string localAssemblyName, string realAssemblyName)
{
int nsIndex, assemblyIndex;
if (IsClrNamespaceUri(@namespace, out nsIndex, out assemblyIndex))
{
// If assembly portion of namespace does not exist, assume that this is part of the local assembly
if (assemblyIndex == -1)
{
return string.Format(CultureInfo.InvariantCulture, "{0};{1}{2}",
@namespace.TrimEnd(' ', ';'), XamlBuildTaskServices.ClrNamespaceUriAssemblyPart, localAssemblyName);
}
else if (!string.IsNullOrEmpty(realAssemblyName) &&
localAssemblyName != realAssemblyName &&
@namespace.Substring(assemblyIndex) == realAssemblyName)
{
return string.Format(CultureInfo.InvariantCulture, "{0}{1}",
@namespace.Substring(0, assemblyIndex), localAssemblyName);
}
}
return @namespace;
}
internal static string GetFullTypeName(XamlType xamlType)
{
string typeName = GetFullTypeNameWithoutNamespace(xamlType);
typeName = xamlType.PreferredXamlNamespace + ":" + typeName;
return typeName;
}
private static string GetFullTypeNameWithoutNamespace(XamlType xamlType)
{
string typeName = string.Empty;
if (xamlType != null)
{
typeName = xamlType.Name;
bool firstTypeArg = true;
if (xamlType.TypeArguments != null && xamlType.TypeArguments.Count > 0)
{
typeName += "(";
foreach (XamlType typeArg in xamlType.TypeArguments)
{
if (!firstTypeArg)
{
typeName += ",";
}
else
{
firstTypeArg = false;
}
typeName += typeArg.Name;
}
typeName += ")";
}
}
return typeName;
}
internal static XamlType GetXamlTypeFromString(string typeName, NamespaceTable namespaceTable, XamlSchemaContext xsc)
{
XamlTypeName xamlTypeName = XamlTypeName.Parse(typeName, namespaceTable);
XamlType xamlType = xsc.GetXamlType(xamlTypeName);
if (xamlType == null)
{
xamlType = GetXamlTypeFromXamlTypeName(xamlTypeName, namespaceTable, xsc);
}
return xamlType;
}
static XamlType GetXamlTypeFromXamlTypeName(XamlTypeName xamlTypeName, NamespaceTable namespaceTable, XamlSchemaContext xsc)
{
IList typeArgs = null;
if (xamlTypeName.TypeArguments.Count > 0)
{
typeArgs = new List();
foreach (var typeArg in xamlTypeName.TypeArguments)
{
typeArgs.Add(GetXamlTypeFromXamlTypeName(typeArg, namespaceTable, xsc));
}
}
return new XamlType(xamlTypeName.Namespace, xamlTypeName.Name, typeArgs, xsc);
}
internal static bool TryGetClrTypeName(XamlType xamlType, string rootNamespace, out string clrTypeName)
{
bool isLocal;
return TryGetClrTypeName(xamlType, rootNamespace, out clrTypeName, out isLocal);
}
internal static bool TryGetClrTypeName(XamlType xamlType, string rootNamespace, out string clrTypeName, out bool isLocal)
{
if (!xamlType.IsUnknown)
{
isLocal = false;
clrTypeName = xamlType.UnderlyingType != null ? xamlType.UnderlyingType.FullName : null;
return (clrTypeName != null);
}
else
{
isLocal = true;
return TryGetClrTypeNameFromLocalType(xamlType, rootNamespace, out clrTypeName);
}
}
internal static bool TryExtractClrNs(string @namespace, out string clrNs)
{
int nsIndex, assemblyIndex;
if (XamlBuildTaskServices.IsClrNamespaceUri(@namespace, out nsIndex, out assemblyIndex))
{
clrNs = (assemblyIndex == -1)
? @namespace.Substring(nsIndex).TrimEnd(' ', ';')
: @namespace.Substring(
nsIndex,
assemblyIndex - XamlBuildTaskServices.ClrNamespaceUriAssemblyPart.Length - nsIndex - 1).TrimEnd(' ', ';');
return true;
}
else
{
clrNs = null;
return false;
}
}
static bool TryGetClrTypeNameFromLocalType(XamlType xamlType, string rootNamespace, out string clrTypeName)
{
//
// This means that either we have a type in the base hierarchy or type arguments
// that is invalid or it's in the local (current) project.
string @namespace = xamlType.PreferredXamlNamespace;
string name = xamlType.Name;
string clrNs;
if (@namespace != null && TryExtractClrNs(@namespace, out clrNs))
{
if (!String.IsNullOrEmpty(rootNamespace) &&
!String.IsNullOrEmpty(clrNs) &&
clrNs.StartsWith(rootNamespace, StringComparison.OrdinalIgnoreCase))
{
if (clrNs.Length > rootNamespace.Length)
{
clrNs = clrNs.Substring(rootNamespace.Length + 1);
}
else
{
clrNs = string.Empty;
}
}
if (string.IsNullOrEmpty(clrNs))
{
clrTypeName = name;
}
else
{
clrTypeName = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", clrNs, name);
}
return true;
}
else
{
if (xamlType.TypeArguments != null && xamlType.TypeArguments.Count > 0)
{
if (GetClrTypeNameFromReflection(xamlType, xamlType.TypeArguments.Count, out clrTypeName))
return true;
}
}
clrTypeName = null;
return false;
}
static bool GetClrTypeNameFromReflection(XamlType typeName, int argumentCount, out string clrTypeName)
{
clrTypeName = null;
string @namespace = typeName.PreferredXamlNamespace;
string xmlnsDefAttributeName = typeof(System.Windows.Markup.XmlnsDefinitionAttribute).FullName;
string xmlnsDefAttributeAssem = typeof(System.Windows.Markup.XmlnsDefinitionAttribute).Assembly.GetName().Name;
var matchingAssemblies =
//
// For each reflection-only assembly in the current application domain...
//
from assembly in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
//
// ...go through all the XmlnsDefinitionAttributes in that assembly...
//
from cad in assembly.GetCustomAttributesData()
where cad.Constructor.DeclaringType.FullName == xmlnsDefAttributeName &&
cad.Constructor.DeclaringType.Assembly.GetName().Name == xmlnsDefAttributeAssem
//
// ... that match the specified namespace...
//
where (@namespace == (string)cad.ConstructorArguments[0].Value)
//
// ... and return an {assembly, clr namespace} pair.
//
select new
{
Assembly = assembly,
Namespace = ((string)cad.ConstructorArguments[1].Value) + "."
};
foreach (var match in matchingAssemblies)
{
string argumentQualifiedName = argumentCount > 0 ? typeName.Name + "`" + argumentCount : typeName.Name;
Type type = match.Assembly.GetType(match.Namespace + argumentQualifiedName, false);
if (type != null)
{
clrTypeName = type.FullName;
return true;
}
}
return false;
}
// Returns true if type namespace is clr-namespace and populates assemblyName
// Else returns false with assemblyName null;
internal static bool GetTypeNameInAssemblyOrNamespace(XamlType type, string localAssemblyName, string realAssemblyName,
out string typeName, out string assemblyName, out string ns)
{
int assemblyIndex, nsIndex;
string typeNs = type.PreferredXamlNamespace;
typeName = GetFullTypeNameWithoutNamespace(type);
if (IsClrNamespaceUri(typeNs, out nsIndex, out assemblyIndex))
{
assemblyName = assemblyIndex > -1 ? typeNs.Substring(assemblyIndex) : String.Empty;
if ((!string.IsNullOrEmpty(localAssemblyName) && assemblyName.Contains(localAssemblyName)) || string.IsNullOrEmpty(assemblyName))
{
assemblyName = realAssemblyName;
}
int nsLength = typeNs.IndexOf(';') - nsIndex;
if (nsLength > 0)
{
ns = typeNs.Substring(nsIndex, nsLength);
}
else
{
ns = typeNs.Substring(nsIndex);
}
return true;
}
else
{
assemblyName = null;
ns = typeNs;
return false;
}
}
internal static string GetTypeName(XamlType type, string localAssemblyName, string realAssemblyName)
{
string typeName, assemblyName, ns;
if (GetTypeNameInAssemblyOrNamespace(type, localAssemblyName, realAssemblyName, out typeName, out assemblyName, out ns))
{
return ns + "." + typeName;
}
else
{
return ns + ":" + typeName;
}
}
// Returns false if the type is known else returns true.
internal static bool GetUnresolvedLeafTypeArg(XamlType type, ref IList unresolvedLeafTypeList)
{
if (unresolvedLeafTypeList != null && type != null && type.IsUnknown)
{
if (!type.IsGeneric)
{
unresolvedLeafTypeList.Add(type);
}
else
{
bool hasUnknownChildren = false;
foreach (XamlType typeArg in type.TypeArguments)
{
hasUnknownChildren |= GetUnresolvedLeafTypeArg(typeArg, ref unresolvedLeafTypeList);
}
if (!hasUnknownChildren)
{
unresolvedLeafTypeList.Add(type);
}
}
return true;
}
else
{
return false;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace Microsoft.Build.Tasks.Xaml
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Security;
using System.Xaml;
using System.Xaml.Schema;
using System.Xml;
using System.Xml.Linq;
using Microsoft.Build.Utilities;
using System.Reflection;
using System.Globalization;
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
using System.CodeDom;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Linq;
internal static class XamlBuildTaskServices
{
internal const string ClrNamespaceUriNamespacePart = "clr-namespace:";
internal const string ClrNamespaceUriAssemblyPart = "assembly=";
internal const string XamlExtension = ".xaml";
//internal static XName SchemaTypeName = XamlSchemaTypeResolver.Default.GetTypeReference(typeof(SchemaType)).Name;
const string UnknownExceptionErrorCode = "XC1000";
// Update this value if any changes are made to it in System.Xaml\KnownStrings.cs
const string serializerReferenceNamePrefix = "__ReferenceID";
internal static string SerializerReferenceNamePrefix
{ get { return serializerReferenceNamePrefix; } }
static string _private = String.Empty;
internal static string PrivateModifier
{ get { return _private; } }
static string _public = String.Empty;
internal static string PublicModifier
{ get { return _public; } }
static string _internal = String.Empty;
internal static string InternalModifier
{ get { return _internal; } }
static string _protected = String.Empty;
internal static string ProtectedModifier
{ get { return _protected; } }
static string _protectedInternal = String.Empty;
internal static string ProtectedInternalModifier
{ get { return _protectedInternal; } }
static string _protectedAndInternal = String.Empty;
internal static string ProtectedAndInternalModifier
{ get { return _protectedAndInternal; } }
static string _publicClass = String.Empty;
internal static string PublicClassModifier
{ get { return _publicClass; } }
static string _internalClass = String.Empty;
internal static string InternalClassModifier
{ get { return _internalClass; } }
static string _fileNotLoaded = String.Empty;
internal static string FileNotLoaded
{
get { return _fileNotLoaded; }
}
internal static void PopulateModifiers(CodeDomProvider codeDomProvider)
{
TypeConverter memberAttributesConverter = codeDomProvider.GetConverter(typeof(MemberAttributes));
if (memberAttributesConverter != null)
{
if (memberAttributesConverter.CanConvertTo(typeof(string)))
{
try
{
_private = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Private).ToUpperInvariant();
_public = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Public).ToUpperInvariant();
_protected = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Family).ToUpperInvariant();
_internal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.Assembly).ToUpperInvariant();
_protectedInternal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.FamilyOrAssembly).ToUpperInvariant();
_protectedAndInternal = memberAttributesConverter.ConvertToInvariantString(MemberAttributes.FamilyAndAssembly).ToUpperInvariant();
}
catch (NotSupportedException)
{
}
}
}
TypeConverter typeAttributesConverter = codeDomProvider.GetConverter(typeof(TypeAttributes));
if (typeAttributesConverter != null)
{
if (typeAttributesConverter.CanConvertTo(typeof(string)))
{
try
{
_internalClass = typeAttributesConverter.ConvertToInvariantString(TypeAttributes.NotPublic).ToUpperInvariant();
_publicClass = typeAttributesConverter.ConvertToInvariantString(TypeAttributes.Public).ToUpperInvariant();
}
catch (NotSupportedException)
{
}
}
}
}
public static Assembly ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
string[] parts = args.Name.Split(',');
foreach (var asm in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
{
AssemblyName assemblyName = asm.GetName();
if (assemblyName.Name.Equals(parts[0], StringComparison.OrdinalIgnoreCase))
{
return asm;
}
}
// The fact that the file can not be found in the referenced assembly list means that
// CLR will throw a FileLoadException once this event handler returns.
// Since the FileLoadException's FileName property is set to null (due to the fact there is no path),
// we are storing it in a static variable so that we can print a pretty error message later on.
_fileNotLoaded = args.Name;
return null;
}
public static AppDomain CreateAppDomain(string friendlyName, string buildTaskPath)
{
if (buildTaskPath == null)
{
throw FxTrace.Exception.AsError(new LoggedException(new InvalidOperationException(SR.BuildTaskPathMustNotBeNull)));
}
// Enable shadow copying in the Designer appdomain, so that we can continue to rebuild
// projects in the solution even if designer has loaded the assemblies that were referenced in current project
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ShadowCopyFiles = "true";
appDomainSetup.ApplicationBase = buildTaskPath;
appDomainSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
// Create appdomain with fulltrust.
return AppDomain.CreateDomain(
friendlyName,
AppDomain.CurrentDomain.Evidence,
appDomainSetup,
new NamedPermissionSet("FullTrust"));
}
internal static IList Load(IList references)
{
IList assemblies = new List();
foreach (var item in references)
{
assemblies.Add(Load(item));
}
bool mscorlibFound = false;
foreach (Assembly asm in assemblies)
{
// here we want to check if the assembly is mscorlib.dll.
// for the current codebase, this check would have worked:
// if (asm == typeof(Object).Assembly), but we
// prefer a check that will continue to work when LMR is used
if (asm.GetReferencedAssemblies().Length == 0)
{
mscorlibFound = true;
}
}
if (!mscorlibFound)
{
assemblies.Add(typeof(Object).Assembly);
}
return assemblies;
}
[SuppressMessage(FxCop.Category.Reliability, FxCop.Rule.AvoidCallingProblematicMethods,
Justification = "Using LoadFile to avoid loading through Fusion and load the exact assembly the developer specified")]
internal static Assembly Load(string reference)
{
if (reference.EndsWith("mscorlib.dll", StringComparison.OrdinalIgnoreCase))
{
return typeof(Object).Assembly;
}
string fullPath = Path.GetFullPath(reference);
try
{
return Assembly.ReflectionOnlyLoadFrom(fullPath);
}
catch (FileNotFoundException e)
{
if (e.FileName == null)
{
throw FxTrace.Exception.AsError((new FileNotFoundException(e.Message, fullPath)));
}
else
throw;
}
}
internal static void LogException(Task task, string message)
{
LogException(task, message, null, 0, 0);
}
internal static void LogException(Task task, string message, string fileName, int lineNumber, int linePosition)
{
string errorCode, logMessage;
ExtractErrorCodeAndMessage(task, message, out errorCode, out logMessage);
task.Log.LogError(null, errorCode, null, fileName, lineNumber, linePosition, 0, 0, logMessage, null);
}
static void ExtractErrorCodeAndMessage(Task task, string message, out string errorCode, out string logMessage)
{
errorCode = task.Log.ExtractMessageCode(message, out logMessage);
if (string.IsNullOrEmpty(errorCode))
{
errorCode = UnknownExceptionErrorCode;
logMessage = SR.UnknownBuildError(message);
}
}
internal static bool IsClrNamespaceUri(string nsName, out int nsIndex, out int assemblyIndex)
{
if (nsName.StartsWith(ClrNamespaceUriNamespacePart, StringComparison.Ordinal))
{
int semicolonIndex = nsName.IndexOf(';');
if (semicolonIndex == -1 || nsName.Trim().EndsWith(";", StringComparison.Ordinal))
{
nsIndex = ClrNamespaceUriNamespacePart.Length;
assemblyIndex = -1;
return true;
}
else
{
int equalsIndex = nsName.IndexOf('=', semicolonIndex);
if (equalsIndex != -1)
{
int start = ClrNamespaceUriNamespacePart.Length;
int assemblyStart = semicolonIndex + 1;
if (equalsIndex - semicolonIndex == ClrNamespaceUriAssemblyPart.Length)
{
for (int i = 0; i < ClrNamespaceUriAssemblyPart.Length; i++)
{
if (nsName[assemblyStart + i] != ClrNamespaceUriAssemblyPart[i])
{
nsIndex = -1;
assemblyIndex = -1;
return false;
}
}
nsIndex = start;
assemblyIndex = assemblyStart + ClrNamespaceUriAssemblyPart.Length;
return true;
}
}
}
}
nsIndex = -1;
assemblyIndex = -1;
return false;
}
internal static string UpdateClrNamespaceUriWithLocalAssembly(string @namespace, string localAssemblyName)
{
return UpdateClrNamespaceUriWithLocalAssembly(@namespace, localAssemblyName, null);
}
internal static string UpdateClrNamespaceUriWithLocalAssembly(string @namespace, string localAssemblyName, string realAssemblyName)
{
int nsIndex, assemblyIndex;
if (IsClrNamespaceUri(@namespace, out nsIndex, out assemblyIndex))
{
// If assembly portion of namespace does not exist, assume that this is part of the local assembly
if (assemblyIndex == -1)
{
return string.Format(CultureInfo.InvariantCulture, "{0};{1}{2}",
@namespace.TrimEnd(' ', ';'), XamlBuildTaskServices.ClrNamespaceUriAssemblyPart, localAssemblyName);
}
else if (!string.IsNullOrEmpty(realAssemblyName) &&
localAssemblyName != realAssemblyName &&
@namespace.Substring(assemblyIndex) == realAssemblyName)
{
return string.Format(CultureInfo.InvariantCulture, "{0}{1}",
@namespace.Substring(0, assemblyIndex), localAssemblyName);
}
}
return @namespace;
}
internal static string GetFullTypeName(XamlType xamlType)
{
string typeName = GetFullTypeNameWithoutNamespace(xamlType);
typeName = xamlType.PreferredXamlNamespace + ":" + typeName;
return typeName;
}
private static string GetFullTypeNameWithoutNamespace(XamlType xamlType)
{
string typeName = string.Empty;
if (xamlType != null)
{
typeName = xamlType.Name;
bool firstTypeArg = true;
if (xamlType.TypeArguments != null && xamlType.TypeArguments.Count > 0)
{
typeName += "(";
foreach (XamlType typeArg in xamlType.TypeArguments)
{
if (!firstTypeArg)
{
typeName += ",";
}
else
{
firstTypeArg = false;
}
typeName += typeArg.Name;
}
typeName += ")";
}
}
return typeName;
}
internal static XamlType GetXamlTypeFromString(string typeName, NamespaceTable namespaceTable, XamlSchemaContext xsc)
{
XamlTypeName xamlTypeName = XamlTypeName.Parse(typeName, namespaceTable);
XamlType xamlType = xsc.GetXamlType(xamlTypeName);
if (xamlType == null)
{
xamlType = GetXamlTypeFromXamlTypeName(xamlTypeName, namespaceTable, xsc);
}
return xamlType;
}
static XamlType GetXamlTypeFromXamlTypeName(XamlTypeName xamlTypeName, NamespaceTable namespaceTable, XamlSchemaContext xsc)
{
IList typeArgs = null;
if (xamlTypeName.TypeArguments.Count > 0)
{
typeArgs = new List();
foreach (var typeArg in xamlTypeName.TypeArguments)
{
typeArgs.Add(GetXamlTypeFromXamlTypeName(typeArg, namespaceTable, xsc));
}
}
return new XamlType(xamlTypeName.Namespace, xamlTypeName.Name, typeArgs, xsc);
}
internal static bool TryGetClrTypeName(XamlType xamlType, string rootNamespace, out string clrTypeName)
{
bool isLocal;
return TryGetClrTypeName(xamlType, rootNamespace, out clrTypeName, out isLocal);
}
internal static bool TryGetClrTypeName(XamlType xamlType, string rootNamespace, out string clrTypeName, out bool isLocal)
{
if (!xamlType.IsUnknown)
{
isLocal = false;
clrTypeName = xamlType.UnderlyingType != null ? xamlType.UnderlyingType.FullName : null;
return (clrTypeName != null);
}
else
{
isLocal = true;
return TryGetClrTypeNameFromLocalType(xamlType, rootNamespace, out clrTypeName);
}
}
internal static bool TryExtractClrNs(string @namespace, out string clrNs)
{
int nsIndex, assemblyIndex;
if (XamlBuildTaskServices.IsClrNamespaceUri(@namespace, out nsIndex, out assemblyIndex))
{
clrNs = (assemblyIndex == -1)
? @namespace.Substring(nsIndex).TrimEnd(' ', ';')
: @namespace.Substring(
nsIndex,
assemblyIndex - XamlBuildTaskServices.ClrNamespaceUriAssemblyPart.Length - nsIndex - 1).TrimEnd(' ', ';');
return true;
}
else
{
clrNs = null;
return false;
}
}
static bool TryGetClrTypeNameFromLocalType(XamlType xamlType, string rootNamespace, out string clrTypeName)
{
//
// This means that either we have a type in the base hierarchy or type arguments
// that is invalid or it's in the local (current) project.
string @namespace = xamlType.PreferredXamlNamespace;
string name = xamlType.Name;
string clrNs;
if (@namespace != null && TryExtractClrNs(@namespace, out clrNs))
{
if (!String.IsNullOrEmpty(rootNamespace) &&
!String.IsNullOrEmpty(clrNs) &&
clrNs.StartsWith(rootNamespace, StringComparison.OrdinalIgnoreCase))
{
if (clrNs.Length > rootNamespace.Length)
{
clrNs = clrNs.Substring(rootNamespace.Length + 1);
}
else
{
clrNs = string.Empty;
}
}
if (string.IsNullOrEmpty(clrNs))
{
clrTypeName = name;
}
else
{
clrTypeName = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", clrNs, name);
}
return true;
}
else
{
if (xamlType.TypeArguments != null && xamlType.TypeArguments.Count > 0)
{
if (GetClrTypeNameFromReflection(xamlType, xamlType.TypeArguments.Count, out clrTypeName))
return true;
}
}
clrTypeName = null;
return false;
}
static bool GetClrTypeNameFromReflection(XamlType typeName, int argumentCount, out string clrTypeName)
{
clrTypeName = null;
string @namespace = typeName.PreferredXamlNamespace;
string xmlnsDefAttributeName = typeof(System.Windows.Markup.XmlnsDefinitionAttribute).FullName;
string xmlnsDefAttributeAssem = typeof(System.Windows.Markup.XmlnsDefinitionAttribute).Assembly.GetName().Name;
var matchingAssemblies =
//
// For each reflection-only assembly in the current application domain...
//
from assembly in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
//
// ...go through all the XmlnsDefinitionAttributes in that assembly...
//
from cad in assembly.GetCustomAttributesData()
where cad.Constructor.DeclaringType.FullName == xmlnsDefAttributeName &&
cad.Constructor.DeclaringType.Assembly.GetName().Name == xmlnsDefAttributeAssem
//
// ... that match the specified namespace...
//
where (@namespace == (string)cad.ConstructorArguments[0].Value)
//
// ... and return an {assembly, clr namespace} pair.
//
select new
{
Assembly = assembly,
Namespace = ((string)cad.ConstructorArguments[1].Value) + "."
};
foreach (var match in matchingAssemblies)
{
string argumentQualifiedName = argumentCount > 0 ? typeName.Name + "`" + argumentCount : typeName.Name;
Type type = match.Assembly.GetType(match.Namespace + argumentQualifiedName, false);
if (type != null)
{
clrTypeName = type.FullName;
return true;
}
}
return false;
}
// Returns true if type namespace is clr-namespace and populates assemblyName
// Else returns false with assemblyName null;
internal static bool GetTypeNameInAssemblyOrNamespace(XamlType type, string localAssemblyName, string realAssemblyName,
out string typeName, out string assemblyName, out string ns)
{
int assemblyIndex, nsIndex;
string typeNs = type.PreferredXamlNamespace;
typeName = GetFullTypeNameWithoutNamespace(type);
if (IsClrNamespaceUri(typeNs, out nsIndex, out assemblyIndex))
{
assemblyName = assemblyIndex > -1 ? typeNs.Substring(assemblyIndex) : String.Empty;
if ((!string.IsNullOrEmpty(localAssemblyName) && assemblyName.Contains(localAssemblyName)) || string.IsNullOrEmpty(assemblyName))
{
assemblyName = realAssemblyName;
}
int nsLength = typeNs.IndexOf(';') - nsIndex;
if (nsLength > 0)
{
ns = typeNs.Substring(nsIndex, nsLength);
}
else
{
ns = typeNs.Substring(nsIndex);
}
return true;
}
else
{
assemblyName = null;
ns = typeNs;
return false;
}
}
internal static string GetTypeName(XamlType type, string localAssemblyName, string realAssemblyName)
{
string typeName, assemblyName, ns;
if (GetTypeNameInAssemblyOrNamespace(type, localAssemblyName, realAssemblyName, out typeName, out assemblyName, out ns))
{
return ns + "." + typeName;
}
else
{
return ns + ":" + typeName;
}
}
// Returns false if the type is known else returns true.
internal static bool GetUnresolvedLeafTypeArg(XamlType type, ref IList unresolvedLeafTypeList)
{
if (unresolvedLeafTypeList != null && type != null && type.IsUnknown)
{
if (!type.IsGeneric)
{
unresolvedLeafTypeList.Add(type);
}
else
{
bool hasUnknownChildren = false;
foreach (XamlType typeArg in type.TypeArguments)
{
hasUnknownChildren |= GetUnresolvedLeafTypeArg(typeArg, ref unresolvedLeafTypeList);
}
if (!hasUnknownChildren)
{
unresolvedLeafTypeList.Add(type);
}
}
return true;
}
else
{
return false;
}
}
}
}
// 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
- OdbcTransaction.cs
- Window.cs
- WindowsRegion.cs
- WebPartTransformerAttribute.cs
- FormsAuthenticationCredentials.cs
- TreeNodeSelectionProcessor.cs
- OleDbConnectionInternal.cs
- ImageBrush.cs
- DataObject.cs
- AssertHelper.cs
- IsolatedStorageException.cs
- BmpBitmapDecoder.cs
- ListenerSingletonConnectionReader.cs
- FormatConvertedBitmap.cs
- WindowsTab.cs
- SQLGuid.cs
- UnsafeNativeMethods.cs
- XMLUtil.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- OutputCacheSettings.cs
- LeaseManager.cs
- SqlSelectStatement.cs
- ExtensionFile.cs
- SqlDependencyUtils.cs
- XslNumber.cs
- Scripts.cs
- If.cs
- TaskDesigner.cs
- NavigatorInvalidBodyAccessException.cs
- PersonalizationProviderCollection.cs
- ProviderConnectionPointCollection.cs
- CodeConstructor.cs
- MasterPage.cs
- StateMachineSubscription.cs
- KeyboardDevice.cs
- Interop.cs
- SpeechUI.cs
- TextAnchor.cs
- TextAutomationPeer.cs
- TreeViewImageIndexConverter.cs
- Page.cs
- NumericPagerField.cs
- DataTemplateKey.cs
- DbModificationCommandTree.cs
- httpstaticobjectscollection.cs
- WebPartUtil.cs
- PhonemeConverter.cs
- AuthorizationSection.cs
- Identity.cs
- HyperLinkStyle.cs
- AutoGeneratedField.cs
- __FastResourceComparer.cs
- CodeVariableReferenceExpression.cs
- LocalizableAttribute.cs
- CustomErrorCollection.cs
- XsdBuildProvider.cs
- SignatureHelper.cs
- ToolBarButton.cs
- ToolboxItemFilterAttribute.cs
- HtmlElementErrorEventArgs.cs
- Msec.cs
- EllipseGeometry.cs
- JoinSymbol.cs
- WebPartEventArgs.cs
- GACIdentityPermission.cs
- ProcessInfo.cs
- ListViewDeleteEventArgs.cs
- MessageDecoder.cs
- WebPartUtil.cs
- HttpMethodConstraint.cs
- CorrelationScope.cs
- ResourceReader.cs
- TextBreakpoint.cs
- DataIdProcessor.cs
- SQLMembershipProvider.cs
- TextDpi.cs
- FixedSOMPage.cs
- Suspend.cs
- DataGridViewRowConverter.cs
- SchemaNames.cs
- DirectoryObjectSecurity.cs
- UTF7Encoding.cs
- ShaderRenderModeValidation.cs
- ThreadAbortException.cs
- SignatureGenerator.cs
- XsltInput.cs
- PathSegment.cs
- WindowsSpinner.cs
- RSAPKCS1KeyExchangeFormatter.cs
- DesignerDeviceConfig.cs
- RenderDataDrawingContext.cs
- AnchoredBlock.cs
- TextEndOfLine.cs
- _TransmitFileOverlappedAsyncResult.cs
- BaseCodeDomTreeGenerator.cs
- LongCountAggregationOperator.cs
- TextElementEnumerator.cs
- TextTreeInsertUndoUnit.cs
- ExternalCalls.cs
- FixedSOMTable.cs