diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets index 3ccabedc09d..e15b10a264f 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets @@ -44,7 +44,7 @@ _ResolveAssemblies MSBuild target. 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 68cb7728107..81f094ee126 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 @@ -1053,6 +1053,67 @@ public void DotNetIncremental ([Values (true, false)] bool isRelease, [Values (" } } + [Test] + public void ProjectDependencies ([Values(true, false)] bool projectReference) + { + // Setup dependencies App A -> Lib B -> Lib C + var path = Path.Combine ("temp", TestName); + + var libB = new XASdkProject (outputType: "Library") { + ProjectName = "LibraryB", + IsRelease = true, + }; + libB.Sources.Clear (); + libB.Sources.Add (new BuildItem.Source ("Foo.cs") { + TextContent = () => @"public class Foo { + public Foo () { + var bar = new Bar(); + } + }", + }); + + var libC = new XASdkProject (outputType: "Library") { + ProjectName = "LibraryC", + IsRelease = true, + }; + libC.Sources.Clear (); + libC.Sources.Add (new BuildItem.Source ("Bar.cs") { + TextContent = () => "public class Bar { }", + }); + + // Add a @(Reference) or @(ProjectReference) + if (projectReference) { + libB.AddReference (libC); + } else { + libB.OtherBuildItems.Add (new BuildItem.Reference ($@"..\{libC.ProjectName}\bin\Release\{libC.TargetFramework}\{libC.ProjectName}.dll")); + } + + // Build libraries + var libCBuilder = CreateDotNetBuilder (libC, Path.Combine (path, libC.ProjectName)); + Assert.IsTrue (libCBuilder.Build (), $"{libC.ProjectName} should succeed"); + var libBBuilder = CreateDotNetBuilder (libB, Path.Combine (path, libB.ProjectName)); + Assert.IsTrue (libBBuilder.Build (), $"{libB.ProjectName} should succeed"); + + var appA = new XASdkProject { + ProjectName = "AppA", + IsRelease = true, + Sources = { + new BuildItem.Source ("Bar.cs") { + TextContent = () => "public class Bar : Foo { }", + } + } + }; + appA.AddReference (libB); + var appBuilder = CreateDotNetBuilder (appA, Path.Combine (path, appA.ProjectName)); + Assert.IsTrue (appBuilder.Build (), $"{appA.ProjectName} should succeed"); + + var apkPath = Path.Combine (FullProjectDirectory, appA.OutputPath, $"{appA.PackageName}-Signed.apk"); + FileAssert.Exists (apkPath); + var helper = new ArchiveAssemblyHelper (apkPath); + helper.AssertContainsEntry ($"assemblies/{libB.ProjectName}.dll"); + helper.AssertContainsEntry ($"assemblies/{libC.ProjectName}.dll"); + } + [Test] public void SignAndroidPackage () { diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 875dc59abe9..07f3598ffef 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -1972,7 +1972,8 @@ because xbuild doesn't support framework reference assemblies. DependsOnTargets="_ResolveAssemblies" > - <_AndroidResolvedSatellitePaths Include="@(ReferenceSatellitePaths)" /> + + <_AndroidResolvedSatellitePaths Condition=" '$(UsingAndroidNETSdk)' != 'true' " Include="@(ReferenceSatellitePaths)" /> <_AndroidResolvedSatellitePaths Include="@(IntermediateSatelliteAssembliesWithTargetPath->'$(OutDir)%(Culture)\$(TargetName).resources.dll')" />