From 9c8a3d6320cd4c76d551d7d4d47f6467b7932cf6 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Fri, 6 Oct 2017 21:19:11 -0700 Subject: [PATCH 1/2] Add facade assemblies for NET46 Adds System.IO.FileSystem for now, I'll add more as they are reported. Includes an assembly resolve handler to load the facades Fixes #11 --- src/RoslynCodeTaskFactory/CodeTaskFactory.cs | 67 ++++++++++++++++-- .../RoslynCodeTaskFactory.csproj | 5 ++ .../lib/net46/System.IO.FileSystem.dll | Bin 0 -> 22744 bytes 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/RoslynCodeTaskFactory/lib/net46/System.IO.FileSystem.dll diff --git a/src/RoslynCodeTaskFactory/CodeTaskFactory.cs b/src/RoslynCodeTaskFactory/CodeTaskFactory.cs index 81a5dd6..b2fadcb 100644 --- a/src/RoslynCodeTaskFactory/CodeTaskFactory.cs +++ b/src/RoslynCodeTaskFactory/CodeTaskFactory.cs @@ -94,6 +94,15 @@ public sealed partial class CodeTaskFactory : ITaskFactory /// private static readonly ConcurrentDictionary CompiledAssemblyCache = new ConcurrentDictionary(); + /// + /// Stores a cache of loaded assemblies by the handler. + /// + private static readonly ConcurrentDictionary LoadedAssemblyCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + private static readonly Lazy ThisAssemblyDirectoryLazy = new Lazy(() => Path.GetDirectoryName(typeof(CodeTaskFactory).GetTypeInfo().Assembly.Location)); + + private static readonly Lazy ThisAssemblyParentDirectoryLazy = new Lazy(() => Path.GetDirectoryName(ThisAssemblyDirectoryLazy.Value)); + /// /// Stores an instance of a for logging messages. /// @@ -121,6 +130,10 @@ public sealed partial class CodeTaskFactory : ITaskFactory /// public void CleanupTask(ITask task) { +#if NET46 + + AppDomain.CurrentDomain.AssemblyResolve -= AppDomain_AssemblyResolve; +#endif } /// @@ -169,6 +182,11 @@ public bool Initialize(string taskName, IDictionary pa TaskType = assembly.GetExportedTypes().FirstOrDefault(type => type.Name.Equals(taskName)); } +#if NET46 + + AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve; +#endif + // Initialization succeeded if we found a type matching the task name from the compiled assembly // return TaskType != null; @@ -443,10 +461,6 @@ internal static bool TryLoadTaskBody(TaskLoggingHelper log, string taskName, str /// can compile their own task library. internal static bool TryResolveAssemblyReferences(TaskLoggingHelper log, TaskInfo taskInfo, out ITaskItem[] items) { - // Use the parent directory of this assembly as a starting point for resolving assemblies - // - string thisAssemblyParentDirectory = Path.GetDirectoryName(Path.GetDirectoryName(typeof(CodeTaskFactory).GetTypeInfo().Assembly.ManifestModule.FullyQualifiedName)); - // Store the list of resolved assemblies because a user can specify a short name or a full path // ISet resolvedAssemblyReferences = new HashSet(StringComparer.OrdinalIgnoreCase); @@ -486,7 +500,7 @@ internal static bool TryResolveAssemblyReferences(TaskLoggingHelper log, TaskInf ? reference : $"{reference}.dll"; - string possiblePath = Path.Combine(thisAssemblyParentDirectory, ReferenceAssemblyDirectoryName, assemblyFileName); + string possiblePath = Path.Combine(ThisAssemblyParentDirectoryLazy.Value, ReferenceAssemblyDirectoryName, assemblyFileName); if (File.Exists(possiblePath)) { @@ -570,6 +584,49 @@ private static IEnumerable GetPropertyStatements(string codeLanguage, IE } } +#if NET46 + + /// + /// A custom handler which loads assemblies needed for the CodeTaskFactory to work. + /// + /// + private Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args) + { + AssemblyName assemblyName = new AssemblyName(args.Name); + + // Guess the path based on the name + // + string candidateAssemblyPath = Path.Combine(ThisAssemblyDirectoryLazy.Value, $"{assemblyName.Name}.dll"); + + // See if the assembly has already been loaded from this path + // + if (LoadedAssemblyCache.TryGetValue(candidateAssemblyPath, out Assembly loadedAssembly)) + { + return loadedAssembly; + } + + if (File.Exists(candidateAssemblyPath)) + { + AssemblyName candidateAssemblyName = AssemblyName.GetAssemblyName(candidateAssemblyPath); + + // Verify that the requested assembly is the same as this one + // + if (assemblyName.FullName.Equals(candidateAssemblyName.FullName, StringComparison.OrdinalIgnoreCase)) + { + loadedAssembly = Assembly.LoadFrom(candidateAssemblyPath); + + // Cache the loaded assembly for later if necessary + // + LoadedAssemblyCache.TryAdd(candidateAssemblyPath, loadedAssembly); + + return loadedAssembly; + } + } + return null; + } + +#endif + /// /// Loads an assembly from the specified path. /// diff --git a/src/RoslynCodeTaskFactory/RoslynCodeTaskFactory.csproj b/src/RoslynCodeTaskFactory/RoslynCodeTaskFactory.csproj index d5fef2f..5b96466 100644 --- a/src/RoslynCodeTaskFactory/RoslynCodeTaskFactory.csproj +++ b/src/RoslynCodeTaskFactory/RoslynCodeTaskFactory.csproj @@ -76,6 +76,11 @@ Content build\ref + + <_PackageFiles Include="lib\**"> + Content + build\ + diff --git a/src/RoslynCodeTaskFactory/lib/net46/System.IO.FileSystem.dll b/src/RoslynCodeTaskFactory/lib/net46/System.IO.FileSystem.dll new file mode 100644 index 0000000000000000000000000000000000000000..e4d8cea4a68e42d1ef3cb5df51d32a722e4b22fe GIT binary patch literal 22744 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 E0I4kH8~^|S literal 0 HcmV?d00001 From 297c57359e7e337a0a421be19adf7d73ba2feb33 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Mon, 9 Oct 2017 08:13:30 -0700 Subject: [PATCH 2/2] Use ManifestModule.FullyQualifiedName instead --- src/RoslynCodeTaskFactory/CodeTaskFactory.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/RoslynCodeTaskFactory/CodeTaskFactory.cs b/src/RoslynCodeTaskFactory/CodeTaskFactory.cs index b2fadcb..691aa37 100644 --- a/src/RoslynCodeTaskFactory/CodeTaskFactory.cs +++ b/src/RoslynCodeTaskFactory/CodeTaskFactory.cs @@ -99,8 +99,14 @@ public sealed partial class CodeTaskFactory : ITaskFactory /// private static readonly ConcurrentDictionary LoadedAssemblyCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - private static readonly Lazy ThisAssemblyDirectoryLazy = new Lazy(() => Path.GetDirectoryName(typeof(CodeTaskFactory).GetTypeInfo().Assembly.Location)); + /// + /// Stores the path to the directory that this assembly is located in. + /// + private static readonly Lazy ThisAssemblyDirectoryLazy = new Lazy(() => Path.GetDirectoryName(typeof(CodeTaskFactory).GetTypeInfo().Assembly.ManifestModule.FullyQualifiedName)); + /// + /// Stores the parent directory of this assembly's directory. + /// private static readonly Lazy ThisAssemblyParentDirectoryLazy = new Lazy(() => Path.GetDirectoryName(ThisAssemblyDirectoryLazy.Value)); ///