diff --git a/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs b/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs index 6fa006694..928ce7f7a 100644 --- a/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs +++ b/src/Orchard.Tests.Modules/Migrations/SchemaCommandGeneratorTests.cs @@ -191,7 +191,7 @@ Features: throw new NotImplementedException(); } - public IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath) { + public IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath) { throw new NotImplementedException(); } diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs index 4b32af63c..f2bbbf216 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionLoaderCoordinatorTests.cs @@ -112,7 +112,7 @@ namespace Orchard.Tests.Environment.Extensions { throw new NotImplementedException(); } - public IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath) { + public IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath) { throw new NotImplementedException(); } diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs index 14381e75e..557a9e021 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs @@ -116,7 +116,7 @@ namespace Orchard.Tests.Environment.Extensions { throw new NotImplementedException(); } - public IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath) { + public IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath) { throw new NotImplementedException(); } diff --git a/src/Orchard/Environment/Extensions/Compilers/DefaultProjectFileParser.cs b/src/Orchard/Environment/Extensions/Compilers/DefaultProjectFileParser.cs index 321ed56ce..b4048bfd5 100644 --- a/src/Orchard/Environment/Extensions/Compilers/DefaultProjectFileParser.cs +++ b/src/Orchard/Environment/Extensions/Compilers/DefaultProjectFileParser.cs @@ -39,15 +39,33 @@ namespace Orchard.Environment.Extensions.Compilers { .Elements(ns("Project")) .Elements(ns("ItemGroup")) .Elements(ns("Reference")) - .Attributes("Include") - .Select(c => new ReferenceDescriptor { SimpleName = ExtractAssemblyName(c.Value), FullName = c.Value }); + .Where(c => c.Attribute("Include") != null) + .Select(c => { + string path = null; + XElement attribute = c.Elements(ns("HintPath")).FirstOrDefault(); + if (attribute != null) { + path = attribute.Value; + } + + return new ReferenceDescriptor { + SimpleName = ExtractAssemblyName(c.Attribute("Include").Value), + FullName = c.Attribute("Include").Value, + Path = path, + ReferenceType = ReferenceType.Library + }; + }); var projectReferences = document .Elements(ns("Project")) .Elements(ns("ItemGroup")) .Elements(ns("ProjectReference")) .Attributes("Include") - .Select(c => new ReferenceDescriptor { SimpleName = Path.GetFileNameWithoutExtension(c.Value), FullName = Path.GetFileNameWithoutExtension(c.Value) }); + .Select(c => new ReferenceDescriptor { + SimpleName = Path.GetFileNameWithoutExtension(c.Value), + FullName = Path.GetFileNameWithoutExtension(c.Value), + Path = c.Value, + ReferenceType = ReferenceType.Project + }); return assemblyReferences.Union(projectReferences); } diff --git a/src/Orchard/Environment/Extensions/Compilers/ProjectFileDescriptor.cs b/src/Orchard/Environment/Extensions/Compilers/ProjectFileDescriptor.cs index a4387f117..7212935c6 100644 --- a/src/Orchard/Environment/Extensions/Compilers/ProjectFileDescriptor.cs +++ b/src/Orchard/Environment/Extensions/Compilers/ProjectFileDescriptor.cs @@ -1,6 +1,11 @@ using System.Collections.Generic; namespace Orchard.Environment.Extensions.Compilers { + public enum ReferenceType { + Library, + Project + } + public class ProjectFileDescriptor { public string AssemblyName { get; set; } public IEnumerable SourceFilenames { get; set; } @@ -9,5 +14,7 @@ namespace Orchard.Environment.Extensions.Compilers { public class ReferenceDescriptor { public string SimpleName { get; set; } public string FullName { get; set; } + public string Path { get; set; } + public ReferenceType ReferenceType { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs index cd16d4f0c..eae0ea91f 100644 --- a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs +++ b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs @@ -54,13 +54,13 @@ namespace Orchard.Environment.Extensions.Loaders { return GetDependencies(dependency.VirtualPath); } - public override IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath){ + public override IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath) { virtualPath = _virtualPathProvider.ToAppRelative(virtualPath); if (StringComparer.OrdinalIgnoreCase.Equals(virtualPath, dependency.VirtualPath)) { - return GetSourceFiles(virtualPath); + return GetDependencies(virtualPath); } - return base.GetFileDependencies(dependency, virtualPath); + return base.GetDynamicModuleDependencies(dependency, virtualPath); } public override void Monitor(ExtensionDescriptor descriptor, Action monitor) { @@ -184,17 +184,31 @@ namespace Orchard.Environment.Extensions.Loaders { } private IEnumerable GetDependencies(string projectPath) { - return new[] {projectPath}.Concat(GetSourceFiles(projectPath)); - } + List dependencies = new[] { projectPath }.ToList(); - private IEnumerable GetSourceFiles(string projectPath) { var basePath = _virtualPathProvider.GetDirectoryName(projectPath); using (var stream = _virtualPathProvider.OpenFile(projectPath)) { var projectFile = _projectFileParser.Parse(stream); - return projectFile.SourceFilenames.Select(f => _virtualPathProvider.Combine(basePath, f)); + // Add source files + dependencies.AddRange(projectFile.SourceFilenames.Select(f => _virtualPathProvider.Combine(basePath, f))); + + // Add Project and Library References + foreach (ReferenceDescriptor referenceDescriptor in projectFile.References.Where(reference => !string.IsNullOrEmpty(reference.Path))) { + string path = _virtualPathProvider.Combine(basePath, referenceDescriptor.Path); + + if (_virtualPathProvider.FileExists(path)) { + dependencies.Add(path); + + if (referenceDescriptor.ReferenceType == ReferenceType.Project) { + dependencies.AddRange(GetDependencies(path)); + } + } + } } + + return dependencies; } private string GetProjectPath(ExtensionDescriptor descriptor) { diff --git a/src/Orchard/Environment/Extensions/Loaders/ExtensionLoaderBase.cs b/src/Orchard/Environment/Extensions/Loaders/ExtensionLoaderBase.cs index e246bfab9..be17465b2 100644 --- a/src/Orchard/Environment/Extensions/Loaders/ExtensionLoaderBase.cs +++ b/src/Orchard/Environment/Extensions/Loaders/ExtensionLoaderBase.cs @@ -58,7 +58,7 @@ namespace Orchard.Environment.Extensions.Loaders { return Enumerable.Empty(); } - public virtual IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath) { + public virtual IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath) { return Enumerable.Empty(); } } diff --git a/src/Orchard/Environment/Extensions/Loaders/IExtensionLoader.cs b/src/Orchard/Environment/Extensions/Loaders/IExtensionLoader.cs index 2b22ebf29..9d681c83a 100644 --- a/src/Orchard/Environment/Extensions/Loaders/IExtensionLoader.cs +++ b/src/Orchard/Environment/Extensions/Loaders/IExtensionLoader.cs @@ -41,6 +41,6 @@ namespace Orchard.Environment.Extensions.Loaders { string GetWebFormAssemblyDirective(DependencyDescriptor dependency); IEnumerable GetWebFormVirtualDependencies(DependencyDescriptor dependency); - IEnumerable GetFileDependencies(DependencyDescriptor dependency, string virtualPath); + IEnumerable GetDynamicModuleDependencies(DependencyDescriptor dependency, string virtualPath); } } \ No newline at end of file diff --git a/src/Orchard/FileSystems/Dependencies/DynamicModuleVirtualPathProvider.cs b/src/Orchard/FileSystems/Dependencies/DynamicModuleVirtualPathProvider.cs index 55b1defd1..b0dda1f0e 100644 --- a/src/Orchard/FileSystems/Dependencies/DynamicModuleVirtualPathProvider.cs +++ b/src/Orchard/FileSystems/Dependencies/DynamicModuleVirtualPathProvider.cs @@ -47,7 +47,7 @@ namespace Orchard.FileSystems.Dependencies { var loader = _loaders.Where(l => l.Name == desc.LoaderName).FirstOrDefault(); if (loader != null) { - var otherDependencies = loader.GetFileDependencies(desc, virtualPath); + var otherDependencies = loader.GetDynamicModuleDependencies(desc, virtualPath); if (otherDependencies.Any()) { var allDependencies = virtualPathDependencies.OfType().Concat(otherDependencies); diff --git a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs index 9cd99d6c9..cc5261710 100644 --- a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs +++ b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs @@ -58,7 +58,12 @@ namespace Orchard.FileSystems.VirtualPath { } public bool FileExists(string virtualPath) { - return HostingEnvironment.VirtualPathProvider.FileExists(virtualPath); + try { + return HostingEnvironment.VirtualPathProvider.FileExists(virtualPath); + } catch { + // Medium Trust or invalid mappings that fall outside the app folder + return false; + } } public bool DirectoryExists(string virtualPath) {