anchor.diff:          RepositoryCommit : string option
       }
   
  -    let crackProjectFile slnDir extraMsbuildProperties (file : string) : CrackedProjectInfo =
  -
  -        let projDir = Path.GetDirectoryName(file)
  -        let projectAssetsJsonPath = Path.Combine(projDir, "obj", "project.assets.json")
  -        if not(File.Exists(projectAssetsJsonPath)) then
  -            failwithf "project '%s' not restored" file
  -
  -        let additionalInfo = [
  -            "OutputType"
  -            "IsTestProject"
  -            "IsPackable"
  -            "RepositoryUrl"
  -            "UsesMarkdownComments"
  -            "FsDocsCollectionNameLink"
  -            "FsDocsLogoSource"
  -            "FsDocsNavbarPosition"
  -            "FsDocsTheme"
  -            "FsDocsLogoLink"
  -            "FsDocsLicenseLink"
  -            "FsDocsReleaseNotesLink"
  -            "FsDocsSourceFolder"
  -            "FsDocsSourceRepository"
  -            "FsDocsWarnOnMissingDocs"
  -            "RepositoryType"
  -            "RepositoryBranch"
  -            "PackageProjectUrl"
  -            "Authors"
  -            "GenerateDocumentationFile"
  -            //Removed because this is typically a multi-line string and dotnet-proj-info can't handle this
  -            //"Description"
  -            "PackageLicenseExpression"
  -            "PackageTags"
  -            "Copyright"
  -            "PackageVersion"
  -            "PackageIconUrl"
  -            //Removed because this is typically a multi-line string and dotnet-proj-info can't handle this
  -            //"PackageReleaseNotes"
  -            "RepositoryCommit"
  -        ]
  +    let private crackProjectFileAndIncludeTargetFrameworks slnDir extraMsbuildProperties (file : string) =
  +        let mapToCrackedProjectInfo (props:Map<string,string>) file=
  +            let msbuildPropString prop = props |> Map.tryFind prop |> Option.bind (function s when String.IsNullOrWhiteSpace(s) -> None | s -> Some s)
  +            let msbuildPropBool prop = prop |> msbuildPropString |> Option.bind msbuildPropBool
  +
  +            {  ProjectFileName = file
  +               TargetPath = msbuildPropString "TargetPath"
  +               IsTestProject = msbuildPropBool "IsTestProject" |> Option.defaultValue false
  +               IsLibrary = msbuildPropString "OutputType" |> Option.map (fun s -> s.ToLowerInvariant()) |> ((=) (Some "library"))
  +               IsPackable = msbuildPropBool "IsPackable" |> Option.defaultValue false
  +               RepositoryUrl = msbuildPropString "RepositoryUrl"
  +               RepositoryType = msbuildPropString "RepositoryType"
  +               RepositoryBranch = msbuildPropString "RepositoryBranch"
  +               FsDocsCollectionNameLink = msbuildPropString "FsDocsCollectionNameLink"
  +               FsDocsSourceFolder = msbuildPropString "FsDocsSourceFolder"
  +               FsDocsSourceRepository = msbuildPropString "FsDocsSourceRepository"
  +               FsDocsLicenseLink = msbuildPropString "FsDocsLicenseLink"
  +               FsDocsReleaseNotesLink = msbuildPropString "FsDocsReleaseNotesLink"
  +               FsDocsLogoLink = msbuildPropString "FsDocsLogoLink"
  +               FsDocsLogoSource = msbuildPropString "FsDocsLogoSource"
  +               FsDocsNavbarPosition = msbuildPropString "FsDocsNavbarPosition"
  +               FsDocsTheme = msbuildPropString "FsDocsTheme"
  +               FsDocsWarnOnMissingDocs = msbuildPropBool "FsDocsWarnOnMissingDocs" |> Option.defaultValue false
  +               UsesMarkdownComments = msbuildPropBool "UsesMarkdownComments" |> Option.defaultValue false
  +               PackageProjectUrl = msbuildPropString "PackageProjectUrl"
  +               Authors = msbuildPropString "Authors"
  +               GenerateDocumentationFile = msbuildPropBool "GenerateDocumentationFile" |> Option.defaultValue false
  +               PackageLicenseExpression = msbuildPropString "PackageLicenseExpression"
  +               PackageTags = msbuildPropString "PackageTags"
  +               Copyright = msbuildPropString "Copyright"
  +               PackageVersion = msbuildPropString "PackageVersion"
  +               PackageIconUrl = msbuildPropString "PackageIconUrl"
  +               RepositoryCommit = msbuildPropString "RepositoryCommit" }
  +
  +        let additionalInfo =
  +            [ "OutputType"
  +              "IsTestProject"
  +              "IsPackable"
  +              "RepositoryUrl"
  +              "UsesMarkdownComments"
  +              "FsDocsCollectionNameLink"
  +              "FsDocsLogoSource"
  +              "FsDocsNavbarPosition"
  +              "FsDocsTheme"
  +              "FsDocsLogoLink"
  +              "FsDocsLicenseLink"
  +              "FsDocsReleaseNotesLink"
  +              "FsDocsSourceFolder"
  +              "FsDocsSourceRepository"
  +              "FsDocsWarnOnMissingDocs"
  +              "RepositoryType"
  +              "RepositoryBranch"
  +              "PackageProjectUrl"
  +              "Authors"
  +              "GenerateDocumentationFile"
  +              //Removed because this is typically a multi-line string and dotnet-proj-info can't handle this
  +              //"Description"
  +              "PackageLicenseExpression"
  +              "PackageTags"
  +              "Copyright"
  +              "PackageVersion"
  +              "PackageIconUrl"
  +              //Removed because this is typically a multi-line string and dotnet-proj-info can't handle this
  +              //"PackageReleaseNotes"
  +              "RepositoryCommit"
  +              "TargetFrameworks"
  +            ]
           let gp() = Inspect.getProperties ("TargetPath" :: additionalInfo)
   
           let loggedMessages = System.Collections.Concurrent.ConcurrentQueue<string>()
  
positive.code:         let result = file |> Inspect.getProjectInfos loggedMessages.Enqueue msbuildExec [gp] []
  
          let msgs = (loggedMessages.ToArray() |> Array.toList)
          //printfn "msgs = %A" msgs
          match result with
          | Ok [Ok (Inspect.GetResult.Properties props)] ->
              let props = readOnlyDict props
              //printfn "props = %A" (Map.toList props)
              let msbuildPropString prop =
                  match props.TryGetValue prop with
                  | false, _ -> None
                  | true, s when String.IsNullOrWhiteSpace s -> None
                  | true, s -> Some s
              let msbuildPropBool prop = prop |> msbuildPropString |> Option.bind msbuildPropBool
  
              {
                  ProjectFileName = file
                  TargetPath = msbuildPropString "TargetPath"
                  IsTestProject = msbuildPropBool "IsTestProject" |> Option.defaultValue false
                  IsLibrary = msbuildPropString "OutputType" |> Option.map (fun s -> s.Equals("library", StringComparison.OrdinalIgnoreCase)) |> Option.defaultValue false
                  IsPackable = msbuildPropBool "IsPackable" |> Option.defaultValue false
                  RepositoryUrl = msbuildPropString "RepositoryUrl"
                  RepositoryType = msbuildPropString "RepositoryType"
                  RepositoryBranch = msbuildPropString "RepositoryBranch"
                  FsDocsCollectionNameLink = msbuildPropString "FsDocsCollectionNameLink"
                  FsDocsSourceFolder = msbuildPropString "FsDocsSourceFolder"
                  FsDocsSourceRepository = msbuildPropString "FsDocsSourceRepository"
                  FsDocsLicenseLink = msbuildPropString "FsDocsLicenseLink"
                  FsDocsReleaseNotesLink = msbuildPropString "FsDocsReleaseNotesLink"
                  FsDocsLogoLink = msbuildPropString "FsDocsLogoLink"
                  FsDocsLogoSource = msbuildPropString "FsDocsLogoSource"
                  FsDocsNavbarPosition = msbuildPropString "FsDocsNavbarPosition"
                  FsDocsTheme = msbuildPropString "FsDocsTheme"
                  FsDocsWarnOnMissingDocs = msbuildPropBool "FsDocsWarnOnMissingDocs" |> Option.defaultValue false
                  UsesMarkdownComments = msbuildPropBool "UsesMarkdownComments" |> Option.defaultValue false
                  PackageProjectUrl = msbuildPropString "PackageProjectUrl"
                  Authors = msbuildPropString "Authors"
                  GenerateDocumentationFile = msbuildPropBool "GenerateDocumentationFile" |> Option.defaultValue false
                  PackageLicenseExpression = msbuildPropString "PackageLicenseExpression"
                  PackageTags = msbuildPropString "PackageTags"
                  Copyright = msbuildPropString "Copyright"
                  PackageVersion = msbuildPropString "PackageVersion"
                  PackageIconUrl = msbuildPropString "PackageIconUrl"
                  RepositoryCommit = msbuildPropString "RepositoryCommit"
              }
          | Ok ok -> failwithf "huh? ok = %A" ok
          | Error err -> failwithf "error - %O\nlog - %s" err (String.concat "\n" msgs)
  
      let getProjectsFromSlnFile (slnPath : string) =
          match InspectSln.tryParseSln slnPath with
  
negative.code:         let exitCode = p.ExitCode
  
          exitCode, (workingDir, exePath, args)
  
      type private CrackErrors=
          | CouldNotGetProperties of Inspect.GetResult
          | NotASingleResult of list<Result<Inspect.GetResult,Inspect.GetProjectInfoErrors<obj>>>
          | GetProjectOptionsErrors of string * (string list)
  
      type CrackedProjectInfo = {
          ProjectFileName : string
  