{"id":20691679,"url":"https://github.com/droppers/refscout","last_synced_at":"2026-01-06T20:40:46.731Z","repository":{"id":112534406,"uuid":"413988682","full_name":"Droppers/RefScout","owner":"Droppers","description":"RefScout is a desktop and command-line application that assists you with identifying conflicting assembly references in your .NET Core and .NET Framework applications.","archived":false,"fork":false,"pushed_at":"2022-04-08T11:01:00.000Z","size":2421,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-01T17:21:58.547Z","etag":null,"topics":["assembly","dotnet","dotnet-tool","reference","reference-analyzer","tool"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Droppers.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-05T21:48:48.000Z","updated_at":"2024-09-08T20:33:45.000Z","dependencies_parsed_at":"2023-05-15T17:45:33.319Z","dependency_job_id":null,"html_url":"https://github.com/Droppers/RefScout","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Droppers%2FRefScout","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Droppers%2FRefScout/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Droppers%2FRefScout/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Droppers%2FRefScout/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Droppers","download_url":"https://codeload.github.com/Droppers/RefScout/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245850257,"owners_count":20682636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assembly","dotnet","dotnet-tool","reference","reference-analyzer","tool"],"created_at":"2024-11-16T23:17:32.871Z","updated_at":"2026-01-06T20:40:46.648Z","avatar_url":"https://github.com/Droppers.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003cimg src=\"./art/logo.svg\" height=\"45\" valign=\"text-bottom\"\u003e\u0026nbsp;\u0026nbsp;RefScout - Reference Analyzer\u003c/h1\u003e\u003c/br\u003e\n\u003cp align=\"center\"\u003e\n  RefScout is a desktop and command-line application that assists you with identifying conflicting assembly references in your .NET Core and .NET Framework applications.\u003cbr\u003e\u003cbr\u003e\n  \u003cimg src=\"./art/screenshot.png\" height=\"500\"\u003e\n\u003c/p\u003e\n\n\u003ch6 align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" height=\"24\" valign=\"middle\"\u003e\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://dotnet.microsoft.com/download\" alt=\".NET target\"\u003e\u003cimg alt=\".NET target\" src=\"https://img.shields.io/badge/.NET-6.0-%23512bd4\" title=\"Go To .NET Download\" height=\"24\" valign=\"middle\"\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003cimg src= \"https://joery.nl/static/vector/logo.svg\" height=\"24\" valign=\"middle\"\u003e\u0026nbsp;\u0026nbsp;By \u003ca href=\"https://joery.nl\"\u003eJoery Droppers\u003c/a\u003e\n\u003c/h6\u003e\n\n## Features\n - .NET Core support (+ single file applications) \n - Interactive desktop application\n - Strong named assemblies\n - .NET Framework config parsing (probing paths, codebase, binding redirects)\n - Reports various conflicts: binding redirect misconfiguration, version mismatch, processor architecture mismatch, missing runtime versions, and more\n\n## Install\n\n\u003ci\u003eThe application is still in-preview, and therefore may not function as intended.\u003c/i\u003e\n\n**Windows**\u003cbr\u003e\n[win-refscout-0.1.zip](https://github.com/Droppers/AssemblyAnalyzer/releases/download/v-0.1-alpha/win-refscout-0.1.zip) (Requires .NET 6.0, CLI+Desktop)\u003cbr\u003e\n[win-contained-refscout-0.1.zip](https://github.com/Droppers/AssemblyAnalyzer/releases/download/v-0.1-alpha/win-contained-refscout-0.1.zip) (Self-contained, CLI)\u003cbr\u003e\n[win-contained-desktop-refscout-0.1.zip](https://github.com/Droppers/AssemblyAnalyzer/releases/download/v-0.1-alpha/win-contained-desktop-refscout-0.1.zip) (Self-contained, Desktop)\u003cbr\u003e\n\n**Linux**\u003cbr\u003e\n[linux-refscout-0.1.zip](https://github.com/Droppers/AssemblyAnalyzer/releases/download/v-0.1-alpha/linux-refscout-0.1.zip) (Requires .NET 6.0, CLI)\u003cbr\u003e\n[linux-contained-refscout-0.1.zip](https://github.com/Droppers/AssemblyAnalyzer/releases/download/v-0.1-alpha/linux-contained-refscout-0.1.zip) (Self-contained, CLI)\n\n**dotnet tool**\u003cbr\u003e\n`dotnet tool install -g refscout`\n\n## Usage\n### Desktop\n\nDrag and drop the application executable or use the \"Select an assembly\" button to analyze the application. After analyzing, you can click on an assembly in the graph on the right side or in the \"Overview\" tab to open a pop-up window with more detailed information about that assembly. \n\nUsing the desktop application should speak for itself, otherwise you can find a description of the options below.\n\n### Command-line\n\n```\nrefscout assembly.exe\nrefscout assembly.dll\n```\n\n#### Options\n```sh\nrefscout [assembly] [options] \n\nassembly - The .NET assembly (.dll or .exe) to be analyzed. \n-c, --config [path] - specificy the location of the app.config or web.config file, defaults to the  config named the same as the input assembly.\n```\n\n**Analyzer options**\n\n```\n-a, --analyze [mode] - Specify to which degree assembly references should be analyzed\n                     - Values: AppDirectSystem, App, All\n-r, --runtime [runtime] - Specify which runtime type should be used for analyzing. Useful for analyzing Mono applications on Windows.\n                        - Values: Default, Core, Framework, Mono\n-sv, --system-versions [mode] - Specify how strict version mismatches of system assemblies should be reported.\n                              - Values: Off, Loose, Strict\n-f, --filter [filter] - Specify a query string to filter the results of the analyzer.\n```\n\n**Visualizer options**\n\n```\n-v, --visualize [mode] - Specify which type of assemblies should be visualized by the visualizer.\n                       - Values: Default, All, Conflicts, App\nConsole\n-cd, --console-detail - Show a more detailed information in the console such as target framework and source language.\n\nDot (GraphViz)\n--dot [graph.dot] - Export analyzer results to a GraphViz dot graph.\n-dotf, --dot-framework - Include an overview of target frameworks used in assemblies.\n\nDGML (Visual Studio graph)\n--dgml [graph.dgml] - Export analyzer results to a Visual Studio DGML graph.\n```\n\n## Screenshots\n\nWill be added when UI is finalized.\n\n## Detailed options\nThese options apply to both the desktop application and the command-line application.\n\n#### Desktop\n - Press the \"graph\" icon on the top right to toggle the assembly tree direction from top -\u003e bottom to left -\u003e right. \n - Press the \".NET\" icon in the top right corner to toggle the visibility of used target frameworks in your application.\n - Press the \"cog wheel\" icon next to the analyze button to open the settings dialog for all other options.\n\n#### Analyze mode\n\nBy default, the direct system references of the assemblies are analyzed. You can choose to analyze only the application-related assemblies or also to analyze the references of system assemblies.\n\n```sh\n-a, --analyze AppDirectSystem # Only analyzes application and direct system references.\n              App             # Only analyzes application related references, not system assemblies.\n              All             # Analyzes everything, including references of system assemblies.\n```\n\n#### Runtime type\n\nBy default the application will determine which runtime to use for analyzing based on the given assembly. However, for Mono applications on Windows, it will always use .NET Framework as runtime type. Specifiy this option in order to override this behavior to use Mono.\n```sh\n-r, --runtime Default   # It automatically determines which runtime the application targets.\n              Core      # .NET Core\n              Framework # .NET Framework\n              Mono      # Mono Runtime\n```\n\n#### Visualize mode\n\nDepending on the number of references, visualizing everything can lead to a cluttered result; therefore, you can specify to which degree the result of the analyzer will be visualized. The default value for the console visualizer is \"conflicts,\" for all other visualizers, \"all.\"\n\n```sh\n-v, --visualize Default    # default `conflicts` for console, `all` for others\n                All        # Visualizes all results from the analyzer.\n                Conflicts  # Only visualizes assemblies and references with conflicts.\n                App        # Only Visualizes application-related assemblies and references.\n```\n\n#### System version cecking\n\nWhen this option is enabled, the analyzer will also consider differences in referenced system assemblies as conflicts.\n\n```sh\n-sv, --system-versions Off    # (default) ignore version mismatches for system assemblies.\n                       Loose  # mark breaking version mismatches as non-breaking, ignore minor mismatches.\n                       Strict # mark breaking version mismatches as breaking, and minor mismatches as information.\n```\n\n#### Filtering results\n\nFilter the analyzer result by providing the `--filter` option or using the desktop application's search input.\n\nThe following filter options are available, precede an option with an exclamation mark to do a NOT search (`!by:PaintDotNet`):\n - `by:PainDotNet`: show assemblies that are referenced by PaintDotNet. \n - `to:PaintDotNet.Data`: show all assemblies that have a reference to PaintDotNet. \n - `source:GAC`: show all assemblies that have been resolved from a specific source: GAC, Local, CodeBase, NotFound, Error. \n - `is:conflict`: show conflicting assemblies.\n - `is:unreferenced`: show assemblies which are unreferenced. \n - `is:system`: show system assemblies. \n\nAn example search filter that will only show conflicting assemblies that are referenced by PaintDotNet is: `from:^PaintDotNet$ is:conflict`\n\nBy default, the filter will do a contains search, precede the text query with ^ to do a startsWith search, succeed with a $ to do an endsWith search, and use both for an exact match. \n\n## Internals\n\n#### Version compatibility\n\nFor references to strong-named assemblies, when there is any difference between the referenced and resolved version, it will be displayed as an fatal mismatch. For regular assemblies, versions are deemed compatible if the major and minor versions of the referenced and resolved assembly are identical. If the major version differs, a reference is considered a breaking mismatch, and displayed as a warning. If only the minor version differs, the reference is considered a non-breaking mismatch, and displayed as informative. \n\n### Architecture mismatch\n\nWhen the entry assembly targets an architecture other than Any CPU, the processor architecture of each referenced assembly is compared to that of the entry assembly and a warning message is shown in case it differs. This does not mean they are actually incompatible.\n\n#### Classifying System and .NET API assemblies\n\nSome other tools check whether the assembly name starts with System, this will fail for e.g., System.IO.Abstractions, or check for the PublicKeyToken. Non-framework assemblies like EntityFramework also have the same PublicKeyToken, making it unreliable. Instead, a static list containing names of .NET APIs and 'System' assemblies is included with the application. These were obtained through the .NET API Browser and the \"RedistList/FrameworkList.xml\" files.\n\n#### Assembly resolution\n\nAssemblies are resolved by incorporating a heavily modified version of the assembly resolver found in ILSpy and Mono.Cecil. To more reliably resolve assemblies from the global assembly cache, fusion.dll is invoked directly, as a backup \"Assembly.Load\" is used to resolve the assembly using the .NET Framework runtime. In case fusion.dll could not resolve the assembly, but the .NET runtime could, the assembly is marked as '[unification](https://patents.google.com/patent/US9009693B2/en)'.\n\n#### Inclusion of local System assemblies\n\nWhen system assemblies are found locally for a .NET Framework application, they will always be analyzed as part of the analyzed application. \n\n#### .NET Core runtime detection\nThe locations that the application will look for .NET Core runtime are the default installation location or the DOTNET_ROOT environment variable. Determining which runtime version will be used when running the application is based on using the roll-forward logic described in the dotnet design document.\n\n## Why?\n\nTo get more familiar with C#, WPF and .NET, since this is my first real C# project. Also, as part of my internship, one of my tasks was documenting the dependencies of .NET applications. However, I lacked a tool to generate a complete overview of an assembly and its references. I stumbled upon the popular AsmSpy tool and found it lacks many features. So I decided to try and create a tool to fill the gap of missing features and familiarize myself with how the runtime resolves assemblies.\n\nCompared to for example AsmSpy, a popular reference analyzer tool, RefScout has full support for binding redirects, codebase (local only), probing directories, strong-named assemblies, architecture mismatches, .NET Core (+ single file), detecting GAC unification, Linux support, and a desktop application.\n\n## Contributing\nI am always open to contributions in this repository. However, make sure to create an issue beforehand to discuss the change. \n\n## Thanks to\n- [adospace/fluent-ui-xaml](https://github.com/adospace/fluent-ui-xaml) for providing Fluent themed WPF styles.\n- [jbevain/cecil](https://github.com/jbevain/cecil) for an awesome assembly file parser.\n- [icsharpcode/ILSpy](https://github.com/icsharpcode/ILSpy) for their assembly resolver.\n- [ElinamLLC/SharpVectors](https://github.com/ElinamLLC/SharpVectors) for the SVG viewer in the desktop application.\n\n## License\n```\nMIT License\n\nCopyright (c) 2022 Joery Droppers (https://github.com/Droppers)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdroppers%2Frefscout","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdroppers%2Frefscout","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdroppers%2Frefscout/lists"}