You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by br...@apache.org on 2013/03/04 13:54:09 UTC

svn commit: r1452306 - in /incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine: notes.md src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs

Author: brett
Date: Mon Mar  4 13:54:09 2013
New Revision: 1452306

URL: http://svn.apache.org/r1452306
Log:
[NPANDAY-578] correct resolution logic

MSBuild has a second target that will override other paths, which is how the reference assemblies are found. 
Included that in the process, and corrected some logic to ensure all the relevant versions are consulted.

Modified:
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md Mon Mar  4 13:54:09 2013
@@ -200,15 +200,9 @@ certain characteristics.
 The reference resolution now mostly matches that of MSBuild, after first
 checking the local Maven repository.
 
-This may still yield different results to Visual Studio, which looks
-primarily at Reference Assemblies at design time. If we moved to .Net 4.0 we
-would be able to more easily use the Microsoft.Build.Utilities to lookup both
-the framework libraries (Which currently use reflection), and the reference
-assemblies (through a similar method in ToolLocationHelper).
-
-In either case, these lookups should just be done to validate the artifact
-exists somewhere. They should not be put into the POM in either case as that
-reduced portability.
+These lookups should just be done to validate the artifact exists somewhere.
+They should not be put into the POM in either case as that reduced
+portability.
 
 Ideally, such dependencies could be marked as `provided` instead, and
 NPanday's own resolution should be able to lookup the correct framework

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs Mon Mar  4 13:54:09 2013
@@ -753,7 +753,7 @@ namespace NPanday.ProjectImporter.Conver
             // (1) Files from current project - indicated by {CandidateAssemblyFiles}
             // (2) $(ReferencePath) - the reference path property, which comes from the .USER file.
             // (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
-            // (4) The directory of MSBuild's "target" runtime from GetFrameworkPath.
+            // (4) The directory of MSBuild's "target" runtime from GetReferenceAssemblyPaths (if applicable) and GetFrameworkPath (<= 3.5).
             //     The "target" runtime folder is the folder of the runtime that MSBuild is a part of.
             // (5) Registered assembly folders, indicated by {Registry:*,*,*}
             // (6) Legacy registered assembly folders, indicated by {AssemblyFolders}
@@ -779,11 +779,11 @@ namespace NPanday.ProjectImporter.Conver
 
             // resolve from target framework directories
             if (refDependency == null && projectDigest.DependencySearchConfig.SearchFramework)
-                refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkDirectories());
+                refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkDirectories(), "target framework");
 
             // resolve from registered assembly directories
             if (refDependency == null && projectDigest.DependencySearchConfig.SearchReferenceAssemblies)
-                refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkAssemblyFoldersEx());
+                refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkAssemblyFoldersEx(), "extra assembly folder");
 
             // resolve from GAC
             if (refDependency == null && projectDigest.DependencySearchConfig.SearchGac)
@@ -800,18 +800,25 @@ namespace NPanday.ProjectImporter.Conver
             Dictionary<string,string> directories = new Dictionary<string,string>();
 
             RegistryKey root = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\" + projectDigest.TargetFrameworkIdentifier);
-            bool found = false;
-            foreach (string key in root.GetSubKeyNames())
+
+            if (projectDigest.TargetFrameworkVersion == "v4.0")
             {
-                if (key.StartsWith(projectDigest.TargetFrameworkVersion))
-                {
-                    RegistryKey assemblyFolderEx = root.OpenSubKey(key + "\\AssemblyFoldersEx");
-                    GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, assemblyFolderEx);
-                    found = true;
-                }
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v4.0.30319\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v3.5\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v3.0\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v2.0.50727\\AssemblyFoldersEx"));
             }
 
-            if (!found)
+            if (directories.Count == 0)
                 log.WarnFormat("No AssemblyFoldersEx registry key found for {0} {1}", projectDigest.TargetFrameworkIdentifier, projectDigest.TargetFrameworkVersion);
 
             return directories;
@@ -819,18 +826,21 @@ namespace NPanday.ProjectImporter.Conver
 
         protected static void GetTargetFrameworkDirectoriesAssemblyFoldersEx(Dictionary<string, string> targetFrameworkDirectories, RegistryKey assemblyFolderEx)
         {
-            foreach (string key in assemblyFolderEx.GetSubKeyNames())
+            if (assemblyFolderEx != null)
             {
-                string v = (string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
-                if (v != null)
+                foreach (string key in assemblyFolderEx.GetSubKeyNames())
                 {
-                    // strip non-alphanumeric characters to make a property
-                    targetFrameworkDirectories.Add(new Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+                    string v = (string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
+                    if (v != null)
+                    {
+                        // strip non-alphanumeric characters to make a property
+                        targetFrameworkDirectories.Add(new Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+                    }
                 }
             }
         }
 
-        private Dependency ResolveDependencyFromDirectories(Reference reference, Dictionary<string, string> directories)
+        private Dependency ResolveDependencyFromDirectories(Reference reference, Dictionary<string, string> directories, string label)
         {
             foreach (KeyValuePair<string, string> entry in directories)
             {
@@ -847,8 +857,8 @@ namespace NPanday.ProjectImporter.Conver
 
                     WarnNonPortableReference(path, refDependency);
 
-                    log.DebugFormat("Resolved {0} from target framework directories: {1}:{2}:{3}",
-                        reference.Name, refDependency.groupId, refDependency.artifactId, refDependency.version);
+                    log.DebugFormat("Resolved {0} from {1} directories: {2}:{3}:{4}",
+                        reference.Name, label, refDependency.groupId, refDependency.artifactId, refDependency.version);
                     return refDependency;
                 }
             }
@@ -895,33 +905,46 @@ namespace NPanday.ProjectImporter.Conver
             {
                 // TODO: add support for WinFX, which adds: $(CLR_REF_PATH) and $(WinFXAssemblyDirectory) (constructed by an MSBuild task)
                 // TODO: add support for CompactFramework, which overwrites with the output of the GetDeviceFrameworkPath MSBuild task
+                // TODO: may need to accommodate design-time facades which have special treatment in MSBuild
 
                 Dictionary<string, string> targetFrameworkDirectories = new Dictionary<string, string>();
 
                 if (projectDigest.TargetFrameworkVersion == "v4.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version40", "Framework40");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5")
+                {
+                    // v4.0 overrides the path to just include the reference assemblies
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version40", "FrameworkRef40");
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5")
+                {
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version35", "FrameworkRef35");
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version35", "Framework35");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+                {
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version30", "FrameworkRef30");
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version30", "Framework30");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+                {
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version20", "Framework20");
-                else if (projectDigest.TargetFrameworkVersion == "v1.1")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v1.1")
+                {
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version11", "Framework11");
-                else
+                }
+
+                if (targetFrameworkDirectories.Count == 0)
+                {
                     log.WarnFormat("Unsupported framework version for determining target framework directories: {0}", projectDigest.TargetFrameworkVersion);
+                }
 
                 // Add SDK directory
                 if (projectDigest.TargetFrameworkVersion == "v4.0")
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version40", "FrameworkSdk40");
                 else if (projectDigest.TargetFrameworkVersion == "v3.5")
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version35", "FrameworkSdk35");
-                else if (projectDigest.TargetFrameworkVersion == "v3.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version30", "FrameworkSdk30");
-                else if (projectDigest.TargetFrameworkVersion == "v2.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version20", "FrameworkSdk20");
-                else if (projectDigest.TargetFrameworkVersion == "v1.1")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version11", "FrameworkSdk11");
+                // Version30 is unsupported for this call
+                // no value for SDK 2.0
 
                 log.InfoFormat("Target framework directories: {0}", string.Join(",", new List<string>(targetFrameworkDirectories.Values).ToArray()));
                 TargetFrameworkDirectories = targetFrameworkDirectories;