summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/Reflection/AssemblyResolver.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/Reflection/AssemblyResolver.cs')
-rw-r--r--tools/Sandcastle/Source/Reflection/AssemblyResolver.cs89
1 files changed, 89 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/Reflection/AssemblyResolver.cs b/tools/Sandcastle/Source/Reflection/AssemblyResolver.cs
new file mode 100644
index 0000000..116dcc8
--- /dev/null
+++ b/tools/Sandcastle/Source/Reflection/AssemblyResolver.cs
@@ -0,0 +1,89 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Xml.XPath;
+
+using System.Compiler;
+
+namespace Microsoft.Ddue.Tools.Reflection {
+
+ public class AssemblyResolver {
+
+ private Dictionary < string, AssemblyNode > cache = new Dictionary < string, AssemblyNode >();
+
+ private bool useGac = true;
+
+ public AssemblyResolver() {
+
+ }
+
+ public AssemblyResolver(XPathNavigator configuration) {
+
+ string useGacValue = configuration.GetAttribute("use-gac", String.Empty);
+ if (!String.IsNullOrEmpty(useGacValue)) useGac = Convert.ToBoolean(useGacValue);
+
+ }
+
+ public event EventHandler < AssemblyReferenceEventArgs > UnresolvedAssemblyReference;
+
+ public bool UseGac {
+ get {
+ return (useGac);
+ }
+ set {
+ useGac = value;
+ }
+ }
+
+ public virtual void Add(AssemblyNode assembly) {
+ if (assembly == null) throw new ArgumentNullException("assembly");
+ string name = assembly.StrongName;
+ assembly.AssemblyReferenceResolution += new Module.AssemblyReferenceResolver(ResolveReference);
+ assembly.AssemblyReferenceResolutionAfterProbingFailed += new Module.AssemblyReferenceResolver(UnresolvedReference);
+ cache[name] = assembly;
+ //Console.WriteLine("added {0}; cache now contains {1}", name, cache.Count);
+ }
+
+ public virtual AssemblyNode ResolveReference(AssemblyReference reference, Module module) {
+
+ if (reference == null) throw new ArgumentNullException("reference");
+
+ //Console.WriteLine("resolving {0}", reference.StrongName);
+
+ // try to get it from the cache
+ string name = reference.StrongName;
+ if (cache.ContainsKey(name)) return (cache[name]);
+
+ // try to get it from the gac
+ if (useGac) {
+ string location = GlobalAssemblyCache.GetLocation(reference);
+ if (location != null) {
+ AssemblyNode assembly = AssemblyNode.GetAssembly(location, null, false, false, false, false);
+ if (assembly != null) {
+ Add(assembly);
+ return (assembly);
+ }
+ }
+ }
+
+ // couldn't find it; return null
+ // Console.WriteLine("returning null on request for {0}", reference.StrongName);
+ //OnUnresolvedAssemblyReference(reference, module);
+ return (null);
+
+ }
+
+ protected virtual void OnUnresolvedAssemblyReference(AssemblyReference reference, Module module) {
+ if (UnresolvedAssemblyReference != null) UnresolvedAssemblyReference(this, new AssemblyReferenceEventArgs(reference, module));
+ }
+
+ private AssemblyNode UnresolvedReference(AssemblyReference reference, Module module) {
+ OnUnresolvedAssemblyReference(reference, module);
+ return (null);
+ }
+
+ }
+
+}