I converted a vNext format .NET xUnit test project (with project.json) to the new .csproj format in Visual Studio 2017 RC and started getting the below error. Most of the online answers to this error say "You have two Main methods; get rid of one." This seems like an obvious solution, but this project has only one Main method.
Error:
CS0017 Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point. Project.Name C:\path\to\Program.cs
Program.cs:
using XunitProgram = Xunit.Runner.DotNet.Program;
namespace My.Namespace.Tests
{
public static class Program
{
public static void Main(string[] args)
{
XunitProgram.Main(args);
}
}
}
Old project.json:
{
"version": "1.0.0-*",
"testRunner": "xunit",
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"debugType": "full"
},
"dependencies": {
"dotnet-test-xunit": "2.2.0",
"xunit": "2.2.0",
"Microsoft.DotNet.InternalAbstractions": "1.0.0"
},
"frameworks": {
"net462": {}
}
}
New Project.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net462</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>
<DebugType>full</DebugType>
<PreserveCompilationContext>true</PreserveCompilationContext>
<AssemblyName>My.Project.Tests</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>My.Project.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace>My.Project.Tests</RootNamespace>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20170106-08" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="xunit" Version="2.2.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Folder Include="SampleInput\" />
</ItemGroup>
</Project>
This took a bit of tinkering to figure out. Upon migration to the new project format in VS 2017, Microsoft quietly added a dependency for Microsoft.NET.Test.Sdk
, which I believe has its own Main method.
If you create a new xUnit Test Project in VS 2017 RC alongside the one that you had migrated, you will notice that it no longer creates a Program.cs with a Main method invoking the XUnit runner.
To fix this, delete your sole visible Main method. Your tests will still execute as normal, provided you have the above package references (Microsoft.NET.Test.Sdk
, xunit.runner.visualstudio
, xunit
).
For when you have a console application with tests in it I prefer this:
tl;dr; Add
<GenerateProgramFile>false</GenerateProgramFile> inside a <PropertyGroup>
element in your test project's .csproj file.
From:
https://andrewlock.net/fixing-the-error-program-has-more-than-one-entry-point-defined-for-console-apps-containing-xunit-tests/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With