diff --git a/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/Program.cs b/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/Program.cs new file mode 100644 index 000000000..f5f4b6d13 --- /dev/null +++ b/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace ConsoleApplication +{ + public class Program + { + public static void Main() + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/project.json b/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/project.json new file mode 100644 index 000000000..4d87acf96 --- /dev/null +++ b/TestAssets/TestProjects/TestLibraryWithMultipleFrameworks/project.json @@ -0,0 +1,20 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": false + }, + + "dependencies": { }, + + "frameworks": { + "net20": { }, + "net35": { }, + "net40": { }, + "net461": { }, + "dnxcore50": { + "dependencies": { + "NETStandard.Library": "1.0.0-rc2-23811" + } + } + } +} diff --git a/src/Microsoft.DotNet.Compiler.Common/AssemblyInfoFileGenerator.cs b/src/Microsoft.DotNet.Compiler.Common/AssemblyInfoFileGenerator.cs index fce3d6db1..96c217e65 100644 --- a/src/Microsoft.DotNet.Compiler.Common/AssemblyInfoFileGenerator.cs +++ b/src/Microsoft.DotNet.Compiler.Common/AssemblyInfoFileGenerator.cs @@ -71,15 +71,33 @@ namespace Microsoft.DotNet.Cli.Compiler.Common [typeof(AssemblyCultureAttribute)] = EscapeCharacters(metadata.Culture), [typeof(NeutralResourcesLanguageAttribute)] = EscapeCharacters(metadata.NeutralLanguage) }; - - NuGetFramework targetFramework = string.IsNullOrEmpty(metadata.TargetFramework) ? null : NuGetFramework.Parse(metadata.TargetFramework); - if (targetFramework != null && !(targetFramework.IsDesktop() && targetFramework.Version < new Version(4, 0))) + + if (IsAllowV4Attributes(metadata)) { attributes[typeof(TargetFrameworkAttribute)] = EscapeCharacters(metadata.TargetFramework); // TargetFrameworkAttribute only exists since .NET 4.0 }; + return attributes; } + private static bool IsAllowV4Attributes(AssemblyInfoOptions metadata) + { + if (string.IsNullOrEmpty(metadata.TargetFramework)) + { + // target framework is unknown. to be on the safe side, return false. + return false; + } + + NuGetFramework targetFramework = NuGetFramework.Parse(metadata.TargetFramework); + if (!targetFramework.IsDesktop()) + { + // assuming .NET Core, which should support .NET 4.0 attributes + return true; + } + + return targetFramework.Version >= new Version(4, 0); + } + private static bool IsSameAttribute(Type attributeType, AttributeSyntax attributeSyntax) { var name = attributeSyntax.Name.ToString(); diff --git a/test/dotnet-build.Tests/BuildOutputTests.cs b/test/dotnet-build.Tests/BuildOutputTests.cs index 1f4a702a8..f91970125 100644 --- a/test/dotnet-build.Tests/BuildOutputTests.cs +++ b/test/dotnet-build.Tests/BuildOutputTests.cs @@ -7,6 +7,7 @@ using FluentAssertions; using Microsoft.DotNet.ProjectModel; using Microsoft.DotNet.Tools.Test.Utilities; using Microsoft.Extensions.PlatformAbstractions; +using NuGet.Frameworks; using Xunit; namespace Microsoft.DotNet.Tools.Builder.Tests @@ -128,6 +129,35 @@ namespace Microsoft.DotNet.Tools.Builder.Tests informationalVersion.Should().BeEquivalentTo("1.0.0-85"); } + [Theory] + [InlineData("net20", false)] + [InlineData("net40", true)] + [InlineData("net461", true)] + [InlineData("dnxcore50", true)] + public void MultipleFrameworks_ShouldHaveValidTargetFrameworkAttribute(string frameworkName, bool shouldHaveTargetFrameworkAttribute) + { + var framework = NuGetFramework.Parse(frameworkName); + + var testInstance = TestAssetsManager.CreateTestInstance("TestLibraryWithMultipleFrameworks") + .WithLockFiles(); + + var cmd = new BuildCommand(Path.Combine(testInstance.TestRoot, Project.FileName), framework: framework.GetShortFolderName()); + cmd.ExecuteWithCapturedOutput().Should().Pass(); + + var output = Path.Combine(testInstance.TestRoot, "bin", "Debug", framework.GetShortFolderName(), "TestLibraryWithMultipleFrameworks.dll"); + var targetFramework = PeReaderUtils.GetAssemblyAttributeValue(output, "TargetFrameworkAttribute"); + + if (shouldHaveTargetFrameworkAttribute) + { + targetFramework.Should().NotBeNull(); + targetFramework.Should().BeEquivalentTo(framework.DotNetFrameworkName); + } + else + { + targetFramework.Should().BeNull(); + } + } + [Fact] public void ResourceTest() {