We have a solution that contains some WiX 3 projects that break commands like dotnet restore and dotnet test when the old style csproj tries to import Wix.CA.targets (https://github.com/wixtoolset/issues/issues/5627). dotnet restore seems to be essential since newer versions of Paket use it, and we want some .NET 8 projects within the same sln/repository root.
I don't think Wix.CA.targets does anything important for package restore and it is not a unit test, we are still using VS or MSBuild to do the actual build.
Is there some condition we can use in a .csproj file to detect when it is being loaded by a dotnet ... and exclude the import?
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WixCATargetsPath Condition=" '$(WixCATargetsPath)' == '' ">C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\Wix.CA.targets</WixCATargetsPath>
...
</PropertyGroup>
...
<Import Project="$(WixCATargetsPath)" Condition="NotDotnetCommand" />
</Project>
> dotnet restore demo.sln
C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\Wix.CA.targets(42,5): error MSB4062: The "ReadRegistry" task
could not be loaded from the assembly C:\Program Files (x86)\WiX Toolset v3.11\bin\WixTasks.dll. Could not load
file or assembly 'Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
'. The system cannot find the file specified. Confirm that the <UsingTask> declaration is correct, that the ass
embly and all its dependencies are available, and that the task contains a public class that implements Microso
ft.Build.Framework.ITask. [C:\Demo\Wix\Wix.csproj]
There is not a built-in property that will tell you that your project is being run via the
dotnettool.However, you can get the full command line with
$([System.Environment]::CommandLine).If this project is named example.proj, you can test running it with the following commands:
In my testing on Windows, the
msbuildcommand showedmsbuildas the executable but thedotnetcommands showed"C:\Program Files\dotnet\sdk\8.0.101\dotnet.dll"as the executable.e.g.
Still, you could initialize an
isDotnetCommandproperty based on if the executable in the command line containsdotnet.