e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
91 lines
3.0 KiB
C#
91 lines
3.0 KiB
C#
namespace System.Workflow.ComponentModel.Compiler
|
|
{
|
|
using System;
|
|
using System.Reflection;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel.Design;
|
|
using System.Workflow.ComponentModel.Compiler;
|
|
using System.Workflow.ComponentModel.Design;
|
|
|
|
#region Class Assembly resolver
|
|
|
|
// In the cases where the WorkflowCompiler is invoked directly, we need to deserialize the
|
|
// xoml before we can create the real TypeProvider, hence it is necessary to look at the
|
|
// referenced assemblies for any types that fail to load. In the VS scenarios, the TypeProvider
|
|
// has already been created and the WorkflowMarkupSerializer will use it first.
|
|
internal sealed class ReferencedAssemblyResolver
|
|
{
|
|
private StringCollection referencedAssemblies = new StringCollection();
|
|
private Assembly localAssembly;
|
|
|
|
private bool resolving = false;
|
|
|
|
public ReferencedAssemblyResolver(StringCollection referencedAssemblies, Assembly localAssembly)
|
|
{
|
|
this.referencedAssemblies = referencedAssemblies;
|
|
this.localAssembly = localAssembly;
|
|
}
|
|
|
|
public Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
|
|
{
|
|
return ResolveAssembly(args.Name);
|
|
}
|
|
|
|
internal void SetLocalAssembly(Assembly localAsm)
|
|
{
|
|
this.localAssembly = localAsm;
|
|
}
|
|
|
|
private Assembly ResolveAssembly(string name)
|
|
{
|
|
if (this.resolving)
|
|
return null;
|
|
|
|
// First look for the local assembly.
|
|
if (this.localAssembly != null && name == this.localAssembly.FullName)
|
|
return this.localAssembly;
|
|
|
|
try
|
|
{
|
|
this.resolving = true;
|
|
|
|
AssemblyName assemblyName = new AssemblyName(name);
|
|
|
|
// Then try the referenced assemblies.
|
|
foreach (string assemblyPath in this.referencedAssemblies)
|
|
{
|
|
try
|
|
{
|
|
AssemblyName referenceAssemblyName = AssemblyName.GetAssemblyName(assemblyPath);
|
|
if (referenceAssemblyName != null && ParseHelpers.AssemblyNameEquals(referenceAssemblyName, assemblyName))
|
|
{
|
|
Assembly reference = null;
|
|
try
|
|
{
|
|
reference = Assembly.Load(referenceAssemblyName);
|
|
}
|
|
catch
|
|
{
|
|
reference = Assembly.LoadFrom(assemblyPath);
|
|
}
|
|
return reference;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// Eat up any exceptions!
|
|
}
|
|
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
this.resolving = false;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|