diff --git a/Documentation/guides/DotNet5.md b/Documentation/guides/DotNet5.md
index 290aa4096f6..b4d28cc0128 100644
--- a/Documentation/guides/DotNet5.md
+++ b/Documentation/guides/DotNet5.md
@@ -3,16 +3,21 @@
_NOTE: this document is very likely to change, as the requirements for
.NET 5 are better understood._
-A .NET 5 project for Xamarin.Android will look something like:
+A .NET 5 project for a Xamarin.Android application will look something
+like:
```xml
net5.0-android
+ Exe
```
+For a "library" project, you would omit the `$(OutputType)` property
+completely or specify `Library`.
+
See the [Target Framework Names in .NET 5][net5spec] spec for details.
[net5spec]: https://github.com/dotnet/designs/blob/5e921a9dc8ecce33b3195dcdb6f10ef56ef8b9d7/accepted/2020/net5/net5.md
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props
index 4e0f37006cf..d46c155f2fc 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props
@@ -22,10 +22,6 @@
Assets
Resource
$(MonoAndroidResourcePrefix)\$(_AndroidResourceDesigner)
- Properties\AndroidManifest.xml
- true
- false
- true
true
Xamarin.Android.Net.AndroidClientHandler
true
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets
index 8d48d505226..b1a30e23148 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets
@@ -5,6 +5,15 @@
<_XamarinAndroidBuildTasksAssembly>$(MSBuildThisFileDirectory)..\tools\Xamarin.Android.Build.Tasks.dll
+
+ true
+ false
+ true
+ Properties\AndroidManifest.xml
+
+ Library
+
+
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets
index 0e89ba3f73d..098ecc5743f 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets
@@ -23,6 +23,14 @@
MonoAndroid
+
+ Properties\AndroidManifest.xml
+ true
+ false
+
+ Library
+
+
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
index 458a274f3cd..e99a993c1b2 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
@@ -1,9 +1,11 @@
using System.IO;
using System.Linq;
using System.Reflection;
+using Mono.Cecil;
using NUnit.Framework;
using Xamarin.Android.Tasks;
using Xamarin.ProjectTools;
+using Xamarin.Tools.Zip;
namespace Xamarin.Android.Build.Tests
{
@@ -29,6 +31,29 @@ public void DotNetBuild ([Values (false, true)] bool isRelease)
Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed");
}
+ [Test]
+ [Category ("SmokeTests")]
+ public void DotNetBuildLibrary ([Values (false, true)] bool isRelease)
+ {
+ var proj = new XASdkProject (SdkVersion, outputType: "Library") {
+ IsRelease = isRelease
+ };
+ var dotnet = CreateDotNetBuilder (proj);
+ Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed");
+
+ var assemblyPath = Path.Combine (Root, dotnet.ProjectDirectory, proj.OutputPath, "UnnamedProject.dll");
+ FileAssert.Exists (assemblyPath);
+ using (var assembly = AssemblyDefinition.ReadAssembly (assemblyPath)) {
+ var resourceName = "__AndroidLibraryProjects__.zip";
+ var resource = assembly.MainModule.Resources.OfType ().FirstOrDefault (r => r.Name == resourceName);
+ Assert.IsNotNull (resource, $"{assemblyPath} should contain a {resourceName} EmbeddedResource");
+ using (var zip = ZipArchive.Open (resource.GetResourceStream ())) {
+ var entry = "library_project_imports/res/values/strings.xml";
+ Assert.IsTrue (zip.ContainsEntry (entry), $"{resourceName} should contain {entry}");
+ }
+ }
+ }
+
static readonly object [] DotNetPublishSource = new object [] {
new object [] {
/* runtimeIdentifier */ "android.21-arm",
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
index cdc210020be..2a59e9df6f0 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
@@ -29,6 +29,7 @@ public static class KnownProperties
public const string OutputPath = "OutputPath";
public const string IntermediateOutputPath = "IntermediateOutputPath";
+ public const string OutputType = "OutputType";
public const string AndroidFastDeploymentType = "AndroidFastDeploymentType";
public const string AndroidClassParser = "AndroidClassParser";
}
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs
index 84de96a29d9..89689ac290b 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs
@@ -24,7 +24,7 @@ public class XASdkProject : DotNetStandard
public string PackageName { get; set; }
public string JavaPackageName { get; set; }
- public XASdkProject (string sdkVersion = "")
+ public XASdkProject (string sdkVersion = "", string outputType = "Exe")
{
Sdk = string.IsNullOrEmpty (sdkVersion) ? "Microsoft.Android.Sdk" : $"Microsoft.Android.Sdk/{sdkVersion}";
TargetFramework = "netcoreapp5.0";
@@ -33,6 +33,7 @@ public XASdkProject (string sdkVersion = "")
JavaPackageName = JavaPackageName ?? PackageName.ToLowerInvariant ();
ExtraNuGetConfigSources = new List { Path.Combine (XABuildPaths.BuildOutputDirectory, "nupkgs") };
GlobalPackagesFolder = Path.Combine (XABuildPaths.TopDirectory, "packages");
+ SetProperty (KnownProperties.OutputType, outputType);
using (var sr = new StreamReader (typeof (XamarinAndroidApplicationProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.AndroidManifest.xml")))
default_android_manifest = sr.ReadToEnd ();
@@ -46,9 +47,11 @@ public XASdkProject (string sdkVersion = "")
}
// Add relevant Android content to our project without writing it to the .csproj file
- Sources.Add (new BuildItem.Source ("Properties\\AndroidManifest.xml") {
- TextContent = () => default_android_manifest.Replace ("${PROJECT_NAME}", ProjectName).Replace ("${PACKAGENAME}", string.Format ("{0}.{0}", ProjectName))
- });
+ if (outputType == "Exe") {
+ Sources.Add (new BuildItem.Source ("Properties\\AndroidManifest.xml") {
+ TextContent = () => default_android_manifest.Replace ("${PROJECT_NAME}", ProjectName).Replace ("${PACKAGENAME}", string.Format ("{0}.{0}", ProjectName))
+ });
+ }
Sources.Add (new BuildItem.Source ($"MainActivity{Language.DefaultExtension}") { TextContent = () => ProcessSourceTemplate (default_main_activity_cs) });
Sources.Add (new BuildItem.Source ("Resources\\layout\\Main.axml") { TextContent = () => default_layout_main });
Sources.Add (new BuildItem.Source ("Resources\\values\\Strings.xml") { TextContent = () => default_strings_xml.Replace ("${PROJECT_NAME}", ProjectName) });
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs
index fdb77afca4a..cf5442240d1 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs
@@ -21,7 +21,7 @@ protected XamarinAndroidProject (string debugConfigurationName = "Debug", string
SetProperty ("ProjectTypeGuids", () => "{" + Language.ProjectTypeGuid + "};{" + ProjectTypeGuid + "}");
SetProperty ("ProjectGuid", () => "{" + ProjectGuid + "}");
- SetProperty ("OutputType", "Library");
+ SetProperty (KnownProperties.OutputType, "Library");
SetProperty ("MonoAndroidAssetsPrefix", "Assets");
SetProperty ("MonoAndroidResourcePrefix", "Resources");
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs
index 2aa7176ca3f..c98a32753bd 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs
@@ -12,7 +12,7 @@ public XamarinPCLProject ()
SetProperty ("ProjectGuid", () => "{" + ProjectGuid + "}");
SetProperty ("TargetFrameworkProfile", "Profile78");
SetProperty ("TargetFrameworkVersion", "v4.5");
- SetProperty ("OutputType", "Library");
+ SetProperty (KnownProperties.OutputType, "Library");
}
public override string ProjectTypeGuid {