SonarScanner for .NET
In version 5.0, we changed the name of the SonarScanner for MSBuild to SonarScanner for .NET.
The documentation is updated with the new name and we will call the scanner SonarScanner for .NET moving forward.
The SonarScanner for .NET is the recommended way to launch an analysis for projects built using
dotnet. It is the result of a collaboration between SonarSource and Microsoft.
It supports .NET Core on every platform (Windows, macOS, Linux).
- At least the minimal version of Java supported by your SonarQube server
- Java 17 is required to run this version of the scanner. If you are running a previous version of Java, you will need a previous version of the scanner.
- The SDK corresponding to your build system:
- If you are using the .NET Framework version of the scanner you will need .NET Framework v4.6.2 or above. For commercial versions of SonarQube to benefit from security analysis you will need .NET Framework v4.7.2 or above
- If you are using the .NET version of the scanner or the .NET Core Global Tool you will need .NET Core SDK 3.1 or above
- The minimum supported version for SonarQube is now 8.9.
- The scanner will fail to start if an older version of SonarQube is detected.
The flavor used to compile the Scanner for .NET (either .NET Framework, .NET Core or .NET) is independent of the .NET version the project you want to analyze has been built with. Concretely, you can analyze .NET Core code with the .NET Framework version of the Scanner. It's only relevant depending on your OS, and on the versions of .NET SDKs that are installed on your build machine.
- Expand the downloaded file into the directory of your choice. We'll refer to it as
<INSTALL_DIRECTORY>in the next steps.
- On Windows, you might need to unblock the ZIP file first (right-click file > Properties > Unblock).
- On Linux/OSX you may need to set execute permissions on the files in
- Uncomment, and update the global settings to point to your SonarQube server by editing
<INSTALL_DIRECTORY>/SonarQube.Analysis.xml. Values set in this file will be applied to all analyses of all projects unless overwritten locally.
Consider setting file system permissions to restrict access to this file.
--version argument is optional. If it is omitted the latest version will be installed. The full list of releases is available on the NuGet page.
.NET Core Global Tool is available from .NET Core 3.1+.
- Copy the server's CA certs to
You can invoke the Scanner using arguments with both dash (
-) or forward-slash (
/) separators. Either of the following will work:
SonarScanner.MSBuild.exe begin /k:"project-key"
SonarScanner.MSBuild.exe begin -k:"project-key"
There are two versions of the SonarScanner for .NET. In the following commands, you need to pass an authentication token using the
sonar.login property. Any project file accepted by MSBuild.exe or dotnet can be used, for example
The first version is based on the "classic" .NET Framework. To use it, execute the following commands from the root folder of your project:
Note: On macOS or Linux, you can also use
mono <path to SonarScanner.MSBuild.exe>.
The second version is based on .NET Core which has a very similar usage:
The .NET Core version can also be used as a .NET Core Global Tool. After installing the Scanner as a global tool as described above it can be invoked as follows:
|.NET Core Global Tool
dotnet sonarscanner begin etc.
|.NET Core 3.1+
dotnet <path to SonarScanner.MSBuild.dll> etc.
|.NET Framework 4.6.2+
SonarScanner.MSBuild.exe begin etc.
- The .NET Core version of the scanner does not support TFS XAML builds and automatic finding/conversion of Code Coverage files. Apart from that, all versions of the Scanner have the same capabilities and command line arguments.
The begin step is executed when you add the
begin command line argument. It hooks into the build pipeline, downloads SonarQube quality profiles and settings, and prepares your project for analysis.
Command Line Parameters:
|[required] Specifies the key of the analyzed project in SonarQube
|[optional] Specifies the name of the analyzed project in SonarQube. Adding this argument will overwrite the project name in SonarQube if it already exists.
|[recommended] Specifies the version of your project.
|[recommended] Specifies the authentication token used to authenticate with to SonarQube. If this argument is added to the begin step, it must also be added to the end step.
|[optional] Specifies the path to a client certificate used to access SonarQube. The certificate must be password protected.
|[optional] Specifies the password for the client certificate used to access SonarQube. Required if a client certificate is used. If this argument is added to the begin step, it must also be added to the end step.
|[optional] Sets the logging verbosity to detailed. Add this argument before sending logs for troubleshooting.
|[optional] Excludes Test Projects from analysis. Add this argument to improve build performance when issues should not be detected in Test Projects.
|[optional] Specifies an additional SonarQube analysis parameter, you can add this argument multiple times.
|[optional] Overrides the
$install_directory/SonarQube.Analysis.xml. You need to give the absolute path to the file.
[optional] Requires version 5.15+. Overrides the path where the scanner downloads its plugins. Plugins that are already present will not be downloaded again, unless newer versions are available.
You can provide a relative or an absolute path.
Defaults to the machine’s temporary files directory.
For detailed information about all available parameters, see analysis parameters.
The "begin" step will modify your build like this:
- the active
CodeAnalysisRuleSetwill be updated to match the SonarQube quality profile
WarningsAsErrorswill be turned off
If your build process cannot tolerate these changes we recommend creating a second build job for SonarQube analysis.
end steps, you need to build your project, execute tests and generate code coverage data. This part is specific to your needs and it is not detailed here. See .NET test coverage for more information.
The rules configured in your SonarQube Quality Profile are run during the build, and it is expected that analyzing with SonarQube can increase build duration from 4 to 8 times. The impact on duration will vary by project and by what rules are enabled; some rules are simple to execute and others take additional time to have the impact and precision expected of them.
The end step is executed when you add the "end" command line argument. It cleans the MSBuild/dotnet build hooks, collects the analysis data generated by the build, the test results, and the code coverage, and then uploads everything to SonarQube
There are only two additional arguments that are allowed for the end step:
|This argument is required if it was added to the begin step.
|This argument is required if it was added to the begin step. Specifies the password for the client certificate used to access SonarQube.
- MSBuild versions 14 and older are not supported. MSBuild 15 is deprecated and support will be removed in a future version. We recommend using MSBuild 16 as a minimal version.
- Web Application projects are supported. Legacy Web Site projects are not.
- Projects targeting multiple frameworks and using preprocessor directives could have slightly inaccurate metrics (lines of code, complexity, etc.) because the metrics are calculated only from the first of the built targets.
See .NET test coverage for details.
Some project types, such as Microsoft Fakes, are automatically excluded from analysis. To manually exclude a different type of project from the analysis, place the following in its .xxproj file.
The Sonar Scanner for .NET requires your project to be built with MSBuild 16. We recommend installing Visual Studio 2022 or later on the analysis machine in order to benefit from the integration and features provided with the Visual Studio ecosystem (VSTest, MSTest unit tests, etc.).
Projects targeting older versions of the .NET Framework can be built using MSBuild 16 by setting the "TargetFrameworkVersion" MSBuild property as documented by Microsoft:
For example, if you want to build a .NET 3.5 project, but you are using a newer MSBuild version:
If you do not want to switch your production build to MSBuild 16, you can set up a separate build dedicated to the SonarQube analysis.
You can read a full description of that subject on our wiki here.
Some analysis parameters can be set for a single MSBuild project by adding them to its .csproj file.
For newer SDK-style projects used by .NET Core, .NET 5, and later, the SonarScanner for .NET will analyze all file types that are supported by the project type (for example,
esproj), MSBuild, and the available language plugins unless explicitly excluded.
If you have an
For older-style projects, the scanner will only analyze files that are listed in the
.vbproj project file. Normally this means that only C# and VB files will be analyzed. To enable the analysis of other types of files, include them in the project file.
More specifically, any files included by an element of one of the
ItemTypes in this list will be analyzed automatically. For example, the following line in your
will enable the analysis of all JS files in the directory
Content is one of the
ItemTypes whose includes are automatically analyzed.
You can also add
ItemTypes to the default list by following these directions.
You can check which files the scanner will analyze by looking in the file .sonarqube\out\sonar-project.properties after MSBuild has finished.
On build machines that connect to the Internet through a proxy server you might experience difficulties connecting to SonarQube. To instruct the Java VM to use specific proxy settings use the following value:
Where yourProxyHost and yourProxyPort are the hostname and the port of your proxy server. There are additional proxy settings for HTTPS, authentication and exclusions that could be passed to the Java VM. For more information see the following article: https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html.
You also need to set the appropriate proxy environment variables used by .NET.
NO_PROXY are all supported. You can find more details here.
I have multiple builds in the same pipeline, each of them getting analyzed even if the Run Code Analysis has already been executed
We don't uninstall the global
ImportBefore targets to support concurrent analyses on the same machine. The main effect is that if you build a solution where a .sonarqube folder is located nearby, then the sonar-dotnet analyzer will be executed along your build task.
To avoid that, you can disable the targets file by adding a build parameter: