BaseAssemblyResolver.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. //
  2. // BaseAssemblyResolver.cs
  3. //
  4. // Author:
  5. // Jb Evain (jbevain@gmail.com)
  6. //
  7. // Copyright (c) 2008 - 2011 Jb Evain
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections.Generic;
  30. using System.IO;
  31. using System.Text;
  32. using Mono.Collections.Generic;
  33. namespace Mono.Cecil {
  34. public delegate AssemblyDefinition AssemblyResolveEventHandler (object sender, AssemblyNameReference reference);
  35. public sealed class AssemblyResolveEventArgs : EventArgs {
  36. readonly AssemblyNameReference reference;
  37. public AssemblyNameReference AssemblyReference {
  38. get { return reference; }
  39. }
  40. public AssemblyResolveEventArgs (AssemblyNameReference reference)
  41. {
  42. this.reference = reference;
  43. }
  44. }
  45. public class AssemblyResolutionException : FileNotFoundException {
  46. readonly AssemblyNameReference reference;
  47. public AssemblyNameReference AssemblyReference {
  48. get { return reference; }
  49. }
  50. public AssemblyResolutionException (AssemblyNameReference reference)
  51. : base (string.Format ("Failed to resolve assembly: '{0}'", reference))
  52. {
  53. this.reference = reference;
  54. }
  55. }
  56. public abstract class BaseAssemblyResolver : IAssemblyResolver {
  57. static readonly bool on_mono = Type.GetType ("Mono.Runtime") != null;
  58. readonly Collection<string> directories;
  59. public void AddSearchDirectory (string directory)
  60. {
  61. directories.Add (directory);
  62. }
  63. public void RemoveSearchDirectory (string directory)
  64. {
  65. directories.Remove (directory);
  66. }
  67. public string [] GetSearchDirectories ()
  68. {
  69. var directories = new string [this.directories.size];
  70. Array.Copy (this.directories.items, directories, directories.Length);
  71. return directories;
  72. }
  73. public virtual AssemblyDefinition Resolve (string fullName)
  74. {
  75. return Resolve (fullName, new ReaderParameters ());
  76. }
  77. public virtual AssemblyDefinition Resolve (string fullName, ReaderParameters parameters)
  78. {
  79. if (fullName == null)
  80. throw new ArgumentNullException ("fullName");
  81. return Resolve (AssemblyNameReference.Parse (fullName), parameters);
  82. }
  83. public event AssemblyResolveEventHandler ResolveFailure;
  84. protected BaseAssemblyResolver ()
  85. {
  86. directories = new Collection<string> (2) { ".", "bin" };
  87. }
  88. AssemblyDefinition GetAssembly (string file, ReaderParameters parameters)
  89. {
  90. if (parameters.AssemblyResolver == null)
  91. parameters.AssemblyResolver = this;
  92. return ModuleDefinition.ReadModule (file, parameters).Assembly;
  93. }
  94. public virtual AssemblyDefinition Resolve (AssemblyNameReference name)
  95. {
  96. return Resolve (name, new ReaderParameters ());
  97. }
  98. public virtual AssemblyDefinition Resolve (AssemblyNameReference name, ReaderParameters parameters)
  99. {
  100. if (name == null)
  101. throw new ArgumentNullException ("name");
  102. if (parameters == null)
  103. parameters = new ReaderParameters ();
  104. var assembly = SearchDirectory (name, directories, parameters);
  105. if (assembly != null)
  106. return assembly;
  107. if (ResolveFailure != null) {
  108. assembly = ResolveFailure (this, name);
  109. if (assembly != null)
  110. return assembly;
  111. }
  112. throw new AssemblyResolutionException (name);
  113. }
  114. AssemblyDefinition SearchDirectory (AssemblyNameReference name, IEnumerable<string> directories, ReaderParameters parameters)
  115. {
  116. var extensions = new [] { ".exe", ".dll" };
  117. foreach (var directory in directories) {
  118. foreach (var extension in extensions) {
  119. string file = Path.Combine (directory, name.Name + extension);
  120. if (File.Exists (file))
  121. return GetAssembly (file, parameters);
  122. }
  123. }
  124. return null;
  125. }
  126. static bool IsZero (Version version)
  127. {
  128. return version == null || (version.Major == 0 && version.Minor == 0 && version.Build == 0 && version.Revision == 0);
  129. }
  130. }
  131. }