165 lines
5.2 KiB
C#
165 lines
5.2 KiB
C#
|
//-----------------------------------------------------------------------------
|
|||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
|
|||
|
namespace Microsoft.VisualBasic.Activities
|
|||
|
{
|
|||
|
using System;
|
|||
|
using System.Globalization;
|
|||
|
using System.Reflection;
|
|||
|
using System.Activities.Expressions;
|
|||
|
using System.Xaml;
|
|||
|
using System.Xml.Linq;
|
|||
|
|
|||
|
public class VisualBasicImportReference : IEquatable<VisualBasicImportReference>
|
|||
|
{
|
|||
|
static AssemblyNameEqualityComparer equalityComparer = new AssemblyNameEqualityComparer();
|
|||
|
AssemblyName assemblyName;
|
|||
|
string assemblyNameString;
|
|||
|
int hashCode;
|
|||
|
string import;
|
|||
|
|
|||
|
public VisualBasicImportReference()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public string Assembly
|
|||
|
{
|
|||
|
get { return this.assemblyNameString; }
|
|||
|
|
|||
|
set
|
|||
|
{
|
|||
|
if (value == null)
|
|||
|
{
|
|||
|
this.assemblyName = null;
|
|||
|
this.assemblyNameString = null;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// FileLoadException thrown from this ctor indicates invalid assembly name
|
|||
|
this.assemblyName = new AssemblyName(value);
|
|||
|
this.assemblyNameString = this.assemblyName.FullName;
|
|||
|
}
|
|||
|
this.EarlyBoundAssembly = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string Import
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return this.import;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (value != null)
|
|||
|
{
|
|||
|
this.import = value.Trim();
|
|||
|
this.hashCode = this.import.ToUpperInvariant().GetHashCode();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
this.import = null;
|
|||
|
this.hashCode = 0;
|
|||
|
}
|
|||
|
this.EarlyBoundAssembly = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
internal AssemblyName AssemblyName
|
|||
|
{
|
|||
|
get { return this.assemblyName; }
|
|||
|
}
|
|||
|
|
|||
|
internal XNamespace Xmlns
|
|||
|
{
|
|||
|
get;
|
|||
|
set;
|
|||
|
}
|
|||
|
|
|||
|
// for the short-cut assembly resolution
|
|||
|
// from VBImportReference.AssemblyName ==> System.Reflection.Assembly
|
|||
|
// this is an internal state that implies the context in which a VB assembly resolution is progressing
|
|||
|
// once VB extracted this Assembly object to pass onto the compiler,
|
|||
|
// it must explicitly set this property back to null.
|
|||
|
// Clone() will also explicitly set this property of the new to null to prevent users from inadvertently
|
|||
|
// creating a copy of VBImportReference that might not resolve to the assembly of his or her intent.
|
|||
|
internal Assembly EarlyBoundAssembly
|
|||
|
{
|
|||
|
get;
|
|||
|
set;
|
|||
|
}
|
|||
|
|
|||
|
internal VisualBasicImportReference Clone()
|
|||
|
{
|
|||
|
VisualBasicImportReference toReturn = (VisualBasicImportReference)this.MemberwiseClone();
|
|||
|
toReturn.EarlyBoundAssembly = null;
|
|||
|
// Also make a clone of the AssemblyName.
|
|||
|
toReturn.assemblyName = (AssemblyName) this.assemblyName.Clone();
|
|||
|
return toReturn;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override int GetHashCode()
|
|||
|
{
|
|||
|
return this.hashCode;
|
|||
|
}
|
|||
|
|
|||
|
public bool Equals(VisualBasicImportReference other)
|
|||
|
{
|
|||
|
if (other == null)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Object.ReferenceEquals(this, other))
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if (this.EarlyBoundAssembly != other.EarlyBoundAssembly)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// VB does case insensitive comparisons for imports
|
|||
|
if (string.Compare(this.Import, other.Import, StringComparison.OrdinalIgnoreCase) != 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// now compare the assemblies
|
|||
|
if (this.AssemblyName == null && other.AssemblyName == null)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
else if (this.AssemblyName == null && other.AssemblyName != null)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
else if (this.AssemblyName != null && other.AssemblyName == null)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return equalityComparer.Equals(this.AssemblyName, other.AssemblyName);
|
|||
|
}
|
|||
|
|
|||
|
internal void GenerateXamlNamespace(INamespacePrefixLookup namespaceLookup)
|
|||
|
{
|
|||
|
// promote reference to xmlns declaration
|
|||
|
string xamlNamespace = null;
|
|||
|
if (this.Xmlns != null && !string.IsNullOrEmpty(this.Xmlns.NamespaceName))
|
|||
|
{
|
|||
|
xamlNamespace = this.Xmlns.NamespaceName;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
xamlNamespace = string.Format(CultureInfo.InvariantCulture, "clr-namespace:{0};assembly={1}", this.Import, this.Assembly);
|
|||
|
}
|
|||
|
// we don't need the return value since we just want to register the namespace/assembly pair
|
|||
|
namespaceLookup.LookupPrefix(xamlNamespace);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|