Wildcard for content in an XNA content project? - visual-studio

I have an XNA 3.1 content project (.contentproj) with the following:
<ItemGroup>
<Compile Include="tiles\B000N800.BMP">
<Name>B000N800</Name>
<Importer>TextureImporter</Importer>
<Processor>TextureProcessor</Processor>
</Compile>
<Compile Include="tiles\B000N801.BMP">
<Name>B000N801</Name>
<Importer>TextureImporter</Importer>
<Processor>TextureProcessor</Processor>
</Compile>
(... and so on ...)
</ItemGroup>
What I'd like to do is be able to specify a wildcard so that tiles\*.bmp gets compiled instead - so that I don't have to keep re-synchronising the content project when I add and remove textures from the "tiles" directory.
Does anyone know a way to do this?
Ideally the solution would ignore the hidden ".svn" directory, under "tiles". And also the content project would continue to work in Visual Studio.

You'll have to use wildcard in your item definition :
<ItemGroup>
<Compile Include="tiles\**\*.BMP"
Exclude="tiles\.svn\*">
<Name>%(Compile.Filename)</Name>
<Importer>TextureImporter</Importer>
<Processor>TextureProcessor</Processor>
</Compile>
</ItemGroup>

I found a blog post by Shawn Hargreaves that describes how to do this for XNA 1.0:
Wildcard content using MSBuild
Based on that, here is what I did which works with XNA 3.1 (and doesn't cause those weird _0 to appear):
Create a separate "tiles.proj" file with the following content:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<WildcardContent Include="tiles\**\*.BMP" Exclude="tiles\.svn\*">
<Importer>TextureImporter</Importer>
<Processor>TextureProcessor</Processor>
</WildcardContent>
</ItemGroup>
<Target Name="BeforeBuild">
<CreateItem Include="#(WildcardContent)" AdditionalMetadata="Name=%(FileName)">
<Output TaskParameter="Include" ItemName="Compile" />
</CreateItem>
</Target>
</Project>
And in the original ".contentproj" file, right before </Project>, add:
<Import Project="tiles.proj" />

Related

F#: How to avoid "[FS0988] Main module of program is empty: nothing will happen when it is run" in Tests Project?

I have a .NET solution with the projects below:
Console: Console .NET Core 2.2
Domain: .NET Standard 2.0
Domain.Tests: Console .NET Core 2.2 (XUnit)
Infrastructure: .NET Standard 2.0
My Domain.Tests.fsproj is defined as:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<IsPackable>false</IsPackable>
<GenerateProgramFile>false</GenerateProgramFile>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FsCheck" Version="3.0.0-alpha4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>
<ItemGroup>
<Compile Include="Dsl.fs" />
<Compile Include="OpenAccountTests.fs" />
<Compile Include="CloseAccountTests.fs" />
<Compile Include="DepositCashTests.fs" />
<Compile Include="WithdrawCashTests.fs" />
<Compile Include="WireMoneyTests.fs" />
<Compile Include="RequestAddressChangeTests.fs" />
<Compile Include="RequestEmailChangeTests.fs" />
<Compile Include="RequestPhoneNumberChangeTests.fs" />
<Compile Include="ValidateAddressChangeTests.fs" />
<Compile Include="ValidateEmailChangeTests.fs" />
<Compile Include="ValidatePhoneNumberChangeTests.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\Domain.fsproj" />
</ItemGroup>
</Project>
But when compiling the solution I have the following warning:
ValidatePhoneNumberChangeTests.fs(102, 35): [FS0988] Main module of program is empty: nothing will happen when it is run
I checked that answer on SO and adding do() at the end of the last file of Domain.Tests: ValidatePhoneNumberChangeTests.fs didn't do anything.
What can I do to get rid of this warning?
#rmunn is on the right track in the comments. <OutputType> defaults to Library when TargetFramework is netstandardXX or net4XX, and Exe when TargetFramework is netcoreappXX.
Setting <OutputType>Library</OutputType> is IMO the best way to fix this, rather than adding an entry point that won't be called.
<TargetFramework>netcoreapp2.2</TargetFramework>
This specifies the Domain.Tests project as an executable
If you only need it to be a class library then change it to
<TargetFramework>netstandard2.0</TargetFramework>
If you simply want to remove the warning you can add a main method by either adding this at the end of ValidatePhoneNumberChangeTests.fs or in a Program.fs at the end of the compilation order
[<EntryPoint>]
let main argv =
0
Just remove the Program.fs and OutputType (it doesn't work for me as well). Set GenerateProgramFile to true in PropertyGroup like that:
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
<GenerateProgramFile>true</GenerateProgramFile>
</PropertyGroup>
cheers!

How to stop .net-core from continuously adding folders when building

Every time I build my .NET Core project, it adds a deeper folder containing the .csproj file in \bin\release. The result is the following folder structure:
D:\home>
D:\home\site>
D:\home\site\repository>
D:\home\site\repository\bin>
D:\home\site\repository\bin\Release>
D:\home\site\repository\bin\Release\netcoreapp2.1>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin\Release>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin>
D:\home\site\repository\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin\Release\netcoreapp2.1\bin\Release>
This keeps on growing when more builds are executed.
In Visual Studio, cleaning and rebuilding helps solve it. After a few builds the filename becomes too long, raising an error when trying to run the application.
At first, it did not really matter, but when deploying the WebApp-Bot to Azure, the same happens. The problem is that I have no option to remove the excessive files from the server. Which is why I need to stop it from happening at all.
The .csproj file:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<UserSecretsId>SOME_USER_SECRETS_ID</UserSecretsId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Compile Remove="%2a%2a\**" />
<Content Remove="%2a%2a\**" />
<EmbeddedResource Remove="%2a%2a\**" />
<None Remove="%2a%2a\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Gremlin.Net" Version="3.4.1" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.Bot.Builder.AI.Luis" Version="4.4.3" />
<PackageReference Include="Microsoft.Bot.Builder.Dialogs" Version="4.4.3" />
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Version="4.4.3" />
<PackageReference Include="Microsoft.Recognizers.Text.DataTypes.TimexExpression" Version="1.1.6" />
</ItemGroup>
<Import Project="PostDeployScripts\IncludeSources.targets" Condition="Exists('PostDeployScripts\IncludeSources.targets')" />
<Import Project="..\PostDeployScripts\IncludeSources.targets" Condition="Exists('..\PostDeployScripts\IncludeSources.targets')" />
<ItemGroup>
<None Remove="%2a%2a\%2a.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="bin\" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties Properties_4launchSettings_1json__JSONSchema="" /></VisualStudio></ProjectExtensions>
</Project>
The includesources.targets, which I see now has the always flag:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Update="**\*.cs">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Compile>
<None Include="**\*.csproj" >
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="PostDeployScripts\*.*" >
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
I would like to know why this happens and how to stop it, all help is welcome.
Your includesources.targets file has this little gem in it:
<Compile Update="**\*.cs">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Compile>
Which would, if I understand correctly, cause the .cs files to be copied to your output folder. The next time a build is triggered, these files will probably also be compiled, creating a new bin\Release\netcoreapp2.1 from that location.
I'm not entirely sure what the targets file is there for, but I am pretty sure it's causing this issue. Try removing the file and the references to it from your .csproj, rebuild your project and see if you can deploy the bot.

Include build directory in nuget package using visual studio pack

I'm attempting to create a nupkg with Visual Studio using the built in nuget package building and include the build directory from my project in the nupkg. It seems like it should be a fairly simple task but I can't get it to work. From my googling adding either of these to my csproj file should work, but both create an empty 'build' directory in the nupkg:
<ItemGroup>
<None Include="build\**">
<Pack>true</Pack>
<PackagePath>build\</PackagePath>
<IncludeInPackage>true</IncludeInPackage>
</None>
</ItemGroup>
Using nuget pack to create the package with the following in my nuspec does work:
<files>
<!-- Include everything in \build -->
<file src="build\**" target="build" />
</files>
Include build directory in nuget package using visual studio pack
According to the document Including content in a package, you should use the properties <Pack>true</Pack> and <PackagePath>build\</PackagePath>:
If you want to copy all your content to only a specific root folder(s) (instead of content and contentFiles both), you can use the MSBuild property ContentTargetFolders, which defaults to "content;contentFiles" but can be set to any other folder names.
PackagePath can be a semicolon-delimited set of target paths.
Specifying an empty package path would add the file to the root of the
package.
So, you can change your ItemGroup like following:
<ItemGroup>
<None Include="build\**" Pack="True" PackagePath="build\" />
</ItemGroup>
Update:
I believe this is the same as what I added but in a different XML
structure and without the Pack attribute
The Pack attribute is the key point. It works fine with your XML structure and the Pack attribute. You should make sure you have the files in the build folder in your project folder:
Check my test demo below:
Update2:
Ah! You are using the .net framework project!! That the reason for this issue. This method is used for .net standard and .net core project by default and it not work for .net framework. To resolve this issue you have to use the .nupsec file, like you post in the question.
If you still want to include build directory in nuget package using visual studio pack, you need change your project type to SDK type:
Check this document for some more details.
Then you can use the method, which we talked about before.
Hope this helps.
The solution to this issue was to upgrade the project to SDK type (Xamarin binding projects by default use the old format but seem to work with the new type) and then use:
<ItemGroup>
<None Update="build\**">
<IncludeInPackage>true</IncludeInPackage>
</None>
</ItemGroup>
To include the build directory. The alternative is using nuget pack.
When converting the project make sure to leave in the Xamarin import:
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" />
Here's how my project file looks afterwards:
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
<PropertyGroup>
<PackageId></PackageId>
<PackageVersion>3.3.2</PackageVersion>
<ReleaseVersion>$(PackageVersion)</ReleaseVersion>
<AssemblyVersion>$(PackageVersion)</AssemblyVersion>
<Authors>Nick Brook</Authors>
<Description></Description>
<Copyright></Copyright>
<PackageProjectUrl></PackageProjectUrl>
<Summary></Summary>
<PackageTags></PackageTags>
<Title></Title>
<PackageReleaseNotes>Initial Release</PackageReleaseNotes>
<OutputType>Library</OutputType>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<OutputPath>bin\$(Configuration)</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<PackageOutputPath>packed</PackageOutputPath>
<PackOnBuild>true</PackOnBuild>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<ObjcBindingApiDefinition Include="ApiDefinition.cs" />
</ItemGroup>
<ItemGroup>
<ObjcBindingCoreSource Include="Structs.cs" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Structs.cs" Condition=" '$(EnableDefaultCompileItems)' == 'true' " />
<Compile Remove="ApiDefinition.cs" Condition=" '$(EnableDefaultCompileItems)' == 'true' " />
</ItemGroup>
<ItemGroup>
<None Remove="packed\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Build.Download" Version="0.4.11" />
<PackageReference Include="NuGet.Build.Packaging" Version="0.2.2" />
</ItemGroup>
<ItemGroup>
<None Update="build\**">
<IncludeInPackage>true</IncludeInPackage>
</None>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" />
</Project>

MSBuild: Include a custom resource file as embedded resource

I am dynamically generating a resource-file at build time with MSBuild, but in order to be able to read from this resource file at run-time, I need it to be an embedded resource.
I have looked everywhere at how to mark a file in a .csproj as embedded resource, I have even tried this to no avail.
<ItemGroup>
<Content Include="Infrastructure\Content\Store\content_store_en.json" />
<EmbeddedResource Include="Infrastructure\Content\Store\content_store_en.json">
</EmbeddedResource>
</ItemGroup>
Is there any way I can achieve this ?
Here is how you do it:
<Target Name="BeforeBuild">
<CreateItem Include="Infrastructure\**\*.json">
<Output ItemName="EmbeddedResource" TaskParameter="Include" />
</CreateItem>
</Target>
Source: http://ayende.com/blog/4446/how-to-setup-dynamic-groups-in-msbuild-without-visual-studio-ruining-them
I changed the CreateItem attribute so it will reflect your question.
I hope it helps...

error in csproj - duplicate item

I have error from visual studio 2010:
Error 1 The item "CrossDomainService.svc.cs" was specified more than once in the "Sources" parameter. Duplicate items are not supported by the "Sources" parameter. WcfServiceDomain
and from msbuild
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets(160,9)
: error MSB3105: The item "CrossDomainService.svc.cs" was specified more than o
nce in the "Sources" parameter. Duplicate items are not supported by the "Sources" parameter. [C:\inetpub\Wwwroot\axaptaWcfConnection\WcfServiceDomain\WcfSer
viceDomain.csproj]
My file is csproj:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{8D40933A-E036-4CD0-9003-314A692724D5}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WcfServiceDomain</RootNamespace>
<AssemblyName>WcfServiceDomain</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile />
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>4.0</OldToolsVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Configuration" />
<Reference Include="System.Drawing" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Web.Services" />
</ItemGroup>
<ItemGroup>
<Content Include="ClientAccessPolicy.xml" />
<Content Include="CrossDomainService.svc" />
<Content Include="Service1.svc" />
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</Content>
<Content Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</Content>
</ItemGroup>
<ItemGroup>
<Compile Include="CrossDomainService.svc.cs">
<DependentUpon>CrossDomainService.svc</DependentUpon>
</Compile>
<Compile Include="ICrossDomainService.cs" />
<Compile Include="Service1.svc.cs">
<DependentUpon>Service1.svc</DependentUpon>
</Compile>
<Compile Include="IService1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>False</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>51421</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>
</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
</Project>
I not see any duplicate :/ Any idea from this error ??
I was facing the same problem in my solution with the same error for one of the source file,
I fixed it out as follows,
Check for the file name for which the error is given.
Find out in which project the file is included.
Open the .csproj file for that particular project (This file can be found in the directory where solution is placed).
Search for the file name for which the error is thrown in the .csproj file.
You will find two entries of the line such as
<Compile Include="duplicate.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
<DependentUpon>Duplicate.aspx</DependentUpon>
</Compile>
<Compile Include="duplicate.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
<DependentUpon>Duplicate.aspx</DependentUpon>
</Compile>
Delete any one line from one of them.
Save the changes.
Reload the project your error must have gone.
For those who encountered the same problem, nothing helped them and they do not want to recreate the project: Try to delete YourPojectName.csproj.user file. It helped me. I modified the .csproj manually before and the modification introduced (somehow) probably some discrepancy to the two files.
You could just open the solution in a regular text editor and remove the dups by hand
Easy!
Just right clic in your project and select "Unload Project"
Right clic one again and edir your_project.csproj
Search a duplicate tag for the file mentioned in the error message.
Save and right clic to choose "Reload Project"
I think I encountered the same problem not too long ago.
The solution was to remove the subtype from the web.config, i.e:
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
To:
<Content Include="Web.config">
</Content>
Now, those have been added again, I'm not sure why. Searching for more information hasn't cleared it up yet.
See:
<Subtype>Designer</Subtype> Added then removed by Visual Studio on load/unload
I have the same problem and the solution was to shorten and sanitize the directory name (it was a backup one and has date and time separated by a semicolon).
Open the file WcfServiceDomain.csproj with a text editor and look for CrossDomainService.svc.cs
It'll probably be there twice. Just delete one of the lines and the project will work again.
I know this is old post but I found this better solution which could help others who are currently having this issue.
In Solution Explorer, select the file/files specified in the error
message or the folder containing these files.
Right-click then select Exclude From Project.
Click the Refresh button.
Select the files or folder again, right-click then select Include In
Project.
The main clue in the error message is - "Sources". This is a misconfiguration in .csproj file, the build targets are being imported twice. It normally stays at the end of the .csproj file under import. File name is some kind of misleading, I was looking with the file name I can only find it once in the whole project file. When I looked in the import I've got similar to this;
<Import Project="..\..\LonestarWeb\packages\Telerik.Sitefinity.Feather.10.2.6651\build\Telerik.Sitefinity.Feather.targets" Condition="Exists('..\..\LonestarWeb\packages\Telerik.Sitefinity.Feather.10.2.6651\build\Telerik.Sitefinity.Feather.targets')" />
<Import Project="\packages\Telerik.Sitefinity.Feather.10.2.6651\build\Telerik.Sitefinity.Feather.targets" Condition="Exists('..\..\LonestarWeb\packages\Telerik.Sitefinity.Feather.10.2.6651\build\Telerik.Sitefinity.Feather.targets')" />
Remove the one you don't need. Reload the solution and you can now compile.
Wildcards!
See the example below from a cproj file. The Class.cs Include is already taken care of by the wildcard Include below it so it has now been Included twice. You obviously want to lose the specific Class.cs Include.
<Compile Include="..\Folder\Class.cs">
<Link>Class.cs</Link>
</Compile>
<!-- lots of things in between ...scroll scroll scroll -->
<Compile Include="..\Folder\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>
I had to delete the class from the project and recreating it again to solve this problem.
The way that I fixed this issue was by going to the location where the file was which was included in the error and find that there was two of the same files. Delete one of them and it should work.
I had to undo the pending changes afterwards as the files then went missing, but after a re-build it worked.
What I did was that I renamed the file in question. Then cleaned the solution (by clicking on Build > Clean Solution). Then Built the solution.
Then renamed the file to original filename. Then cleaned the solution and built the solution again.
It worked for me. I dont know if it ll work for u.
For me I unload the project,
Edit .csproj file,
search for the filename which was showing in error
<ItemGroup>
<Compile Include="Controllers\BaseUserContext.cs" />
</ItemGroup>
It was not showing multiple time (BaseUserContext.cs), only 1 tag was there, so I removed it and works without an error.
I had a similar issue. I opened an already existing VS solution for the first time one my machine. This VS solution was not created by a human beeing, but generated from an openAPI-specification using Swagger-Editor.
Initially the solution did not have any problems at all. I could build the solution and I was also able to run the code. The actual issue appeared as soon as I added a new class to any of the projects of the solution (just: 'Right Click' > 'Add' > 'New Item' > 'Class'). No matter what name I chose for that new class I always got the compilererror
The item "MyNewClass.cs" was specified more than once in the "Sources" parameter. Duplicate items are not supported by the "Sources" parameter.
Once I removed the class, everything was fine again.
Besides VS, I also have JetBrains Rider (2020.1) on my machine. So I opened the same solution in Rider and added a new class. In Rider, the error did not appear. I was able to add as many classes as I wanted.
In the end, it came down to wildcards, as 'CAD bloke' already mentioned in his answer above.
The original solution generated by the abovementioned Swagger-Editor contains this piece of XML in it's .csproj-file:
<ItemGroup>
<Compile Include="**\*.cs" Exclude="obj\**" />
</ItemGroup>
If I add a new class using VS it becomes this, which in turn causes the error:
<ItemGroup>
<Compile Include="**\*.cs" Exclude="obj\**" />
<Compile Include="Api\NewClass.cs" />
</ItemGroup>
VS is not aware of the wildcard in use. If I add a class using Rider, the additional <Compile Include="Api\NewClass.cs" /> is not added. Rider is aware of the wildcard!
Seems like the guys at JetBrains are better at dealing with microsofts csproj-format, than microsoft.
How to fix this
To fix this issue in the end, I excluded all source files from the project ('right click' > 'Exclude from Project'). Then I closed the solution and opened the .csproj file in a text editor. I removed the <Compile Include="**\*.cs" Exclude="obj\**" /> from the .csproj-file. After removing the line I opened the solution again in VS and included all source files again ('Show all files' (in solution explorer) > 'right click' > 'Include in project').
Instead of the single wildcard, all files are now defined as
<ItemGroup>
<Compile Include="Api\NewClass.cs" />
<Compile Include="Api\SecondClass.cs" />
<Compile Include="Api\ThirdClass.cs" />
...
</ItemGroup>
in the .csproj-file.
If you want to reproduce this yourself
Visit: https://swagger.io/tools/swagger-editor/
Click 'Live Demo'
'Generate Client' > 'csharp'
The step above downloads a zip-file with the VS-solution
Open the solution with VS and add a class
After adding the class you should have the error (unless you used Rider)
Only solution was recreate project :/

Resources