@@ -223,5 +223,230 @@ public void CheckSignApk ([Values(true, false)] bool useApkSigner)
223
223
Assert . IsTrue ( b . Build ( proj ) , "build failed" ) ;
224
224
}
225
225
}
226
+
227
+ [ Test ]
228
+ public void NetStandardReferenceTest ( )
229
+ {
230
+ var netStandardProject = new DotNetStandard ( ) {
231
+ Language = XamarinAndroidProjectLanguage . CSharp ,
232
+ ProjectName = "XamFormsSample" ,
233
+ ProjectGuid = Guid . NewGuid ( ) . ToString ( ) ,
234
+ Sdk = "Microsoft.NET.Sdk" ,
235
+ TargetFramework = "netstandard1.4" ,
236
+ IsRelease = true ,
237
+ PackageTargetFallback = "portable-net45+win8+wpa81+wp8" ,
238
+ PackageReferences = {
239
+ KnownPackages . XamarinFormsPCL_2_3_4_231 ,
240
+ new Package ( ) {
241
+ Id = "System.IO.Packaging" ,
242
+ Version = "4.4.0" ,
243
+ } ,
244
+ new Package ( ) {
245
+ Id = "Newtonsoft.Json" ,
246
+ Version = "10.0.3"
247
+ } ,
248
+ } ,
249
+ OtherBuildItems = {
250
+ new BuildItem ( "None" ) {
251
+ Remove = ( ) => "**\\ *.xaml" ,
252
+ } ,
253
+ new BuildItem ( "Compile" ) {
254
+ Update = ( ) => "**\\ *.xaml.cs" ,
255
+ DependentUpon = ( ) => "%(Filename)"
256
+ } ,
257
+ new BuildItem ( "EmbeddedResource" ) {
258
+ Include = ( ) => "**\\ *.xaml" ,
259
+ SubType = ( ) => "Designer" ,
260
+ Generator = ( ) => "MSBuild:UpdateDesignTimeXaml" ,
261
+ } ,
262
+ } ,
263
+ Sources = {
264
+ new BuildItem . Source ( "App.xaml.cs" ) {
265
+ TextContent = ( ) => @"using System;
266
+ using System.Collections.Generic;
267
+ using System.Linq;
268
+ using System.Text;
269
+ using Newtonsoft.Json;
270
+
271
+ using Xamarin.Forms;
272
+
273
+ namespace XamFormsSample
274
+ {
275
+ public partial class App : Application
276
+ {
277
+ public App()
278
+ {
279
+ JsonConvert.DeserializeObject<string>(""test"");
280
+ InitializeComponent();
281
+ }
282
+
283
+ protected override void OnStart()
284
+ {
285
+ // Handle when your app starts
286
+ }
287
+
288
+ protected override void OnSleep()
289
+ {
290
+ // Handle when your app sleeps
291
+ }
292
+
293
+ protected override void OnResume()
294
+ {
295
+ // Handle when your app resumes
296
+ }
297
+ }
298
+ }" ,
299
+ } ,
300
+ new BuildItem . Source ( "App.xaml" ) {
301
+ TextContent = ( ) => @"<?xml version=""1.0"" encoding=""utf-8"" ?>
302
+ <Application xmlns=""http://xamarin.com/schemas/2014/forms""
303
+ xmlns:x=""http://schemas.microsoft.com/winfx/2009/xaml""
304
+ x:Class=""XamFormsSample.App"">
305
+ <Application.Resources>
306
+ <!-- Application resource dictionary -->
307
+ </Application.Resources>
308
+ </Application>" ,
309
+ } ,
310
+ } ,
311
+ } ;
312
+
313
+ var app = new XamarinAndroidApplicationProject ( ) {
314
+ ProjectName = "App1" ,
315
+ IsRelease = true ,
316
+ UseLatestPlatformSdk = true ,
317
+ References = {
318
+ new BuildItem . Reference ( "Mono.Android.Export" ) ,
319
+ new BuildItem . ProjectReference ( $ "..\\ { netStandardProject . ProjectName } \\ { netStandardProject . ProjectName } .csproj",
320
+ netStandardProject . ProjectName , netStandardProject . ProjectGuid ) ,
321
+ } ,
322
+ PackageReferences = {
323
+ KnownPackages . SupportDesign_25_4_0_1 ,
324
+ KnownPackages . SupportV7CardView_24_2_1 ,
325
+ KnownPackages . AndroidSupportV4_25_4_0_1 ,
326
+ KnownPackages . SupportCoreUtils_25_4_0_1 ,
327
+ KnownPackages . SupportMediaCompat_25_4_0_1 ,
328
+ KnownPackages . SupportFragment_25_4_0_1 ,
329
+ KnownPackages . SupportCoreUI_25_4_0_1 ,
330
+ KnownPackages . SupportCompat_25_4_0_1 ,
331
+ KnownPackages . SupportV7AppCompat_25_4_0_1 ,
332
+ KnownPackages . XamarinForms_2_3_4_231 ,
333
+ }
334
+ } ;
335
+ app . SetProperty ( KnownProperties . AndroidSupportedAbis , "x86;armeabi-v7a" ) ;
336
+ var expectedFiles = new string [ ] {
337
+ "Java.Interop.dll" ,
338
+ "Mono.Android.dll" ,
339
+ "mscorlib.dll" ,
340
+ "mscorlib.dll.mdb" ,
341
+ "System.Collections.Concurrent.dll" ,
342
+ "System.Collections.dll" ,
343
+ "System.Core.dll" ,
344
+ "System.Diagnostics.Debug.dll" ,
345
+ "System.dll" ,
346
+ "System.Linq.dll" ,
347
+ "System.Reflection.dll" ,
348
+ "System.Reflection.Extensions.dll" ,
349
+ "System.Runtime.dll" ,
350
+ "System.Runtime.Extensions.dll" ,
351
+ "System.Runtime.InteropServices.dll" ,
352
+ "System.Runtime.Serialization.dll" ,
353
+ "System.Threading.dll" ,
354
+ "System.IO.Packaging.dll" ,
355
+ "System.IO.Compression.dll" ,
356
+ "System.IO.Compression.pdb" ,
357
+ "Mono.Android.Export.dll" ,
358
+ "Mono.Android.Export.pdb" ,
359
+ "App1.dll" ,
360
+ "App1.pdb" ,
361
+ "FormsViewGroup.dll" ,
362
+ "FormsViewGroup.dll.mdb" ,
363
+ "Xamarin.Android.Support.Compat.dll" ,
364
+ "Xamarin.Android.Support.Core.UI.dll" ,
365
+ "Xamarin.Android.Support.Core.Utils.dll" ,
366
+ "Xamarin.Android.Support.Design.dll" ,
367
+ "Xamarin.Android.Support.Fragment.dll" ,
368
+ "Xamarin.Android.Support.Media.Compat.dll" ,
369
+ "Xamarin.Android.Support.v4.dll" ,
370
+ "Xamarin.Android.Support.v7.AppCompat.dll" ,
371
+ "Xamarin.Android.Support.Animated.Vector.Drawable.dll" ,
372
+ "Xamarin.Android.Support.Vector.Drawable.dll" ,
373
+ "Xamarin.Android.Support.Transition.dll" ,
374
+ "Xamarin.Android.Support.v7.MediaRouter.dll" ,
375
+ "Xamarin.Android.Support.v7.RecyclerView.dll" ,
376
+ "Xamarin.Android.Support.Annotations.dll" ,
377
+ "Xamarin.Android.Support.v7.CardView.dll" ,
378
+ "Xamarin.Forms.Core.dll" ,
379
+ "Xamarin.Forms.Core.dll.mdb" ,
380
+ "Xamarin.Forms.Platform.Android.dll" ,
381
+ "Xamarin.Forms.Platform.Android.dll.mdb" ,
382
+ "Xamarin.Forms.Platform.dll" ,
383
+ "Xamarin.Forms.Xaml.dll" ,
384
+ "Xamarin.Forms.Xaml.dll.mdb" ,
385
+ "XamFormsSample.dll" ,
386
+ "XamFormsSample.pdb" ,
387
+ "Mono.Android.pdb" ,
388
+ "System.Core.pdb" ,
389
+ "System.pdb" ,
390
+ "Mono.Security.dll" ,
391
+ "Mono.Security.pdb" ,
392
+ "System.Xml.dll" ,
393
+ "System.Xml.pdb" ,
394
+ "System.ComponentModel.Composition.dll" ,
395
+ "System.ComponentModel.Composition.pdb" ,
396
+ "System.Net.Http.dll" ,
397
+ "System.Net.Http.pdb" ,
398
+ "System.Runtime.Serialization.pdb" ,
399
+ "System.ServiceModel.Internals.dll" ,
400
+ "System.ServiceModel.Internals.pdb" ,
401
+ "System.Threading.Tasks.dll" ,
402
+ "System.ObjectModel.dll" ,
403
+ "System.Globalization.dll" ,
404
+ "System.ComponentModel.dll" ,
405
+ "System.Xml.ReaderWriter.dll" ,
406
+ "System.Linq.Expressions.dll" ,
407
+ "System.IO.dll" ,
408
+ "System.Dynamic.Runtime.dll" ,
409
+ "System.Text.RegularExpressions.dll" ,
410
+ "System.Diagnostics.Tools.dll" ,
411
+ "Newtonsoft.Json.dll" ,
412
+ "Microsoft.CSharp.dll" ,
413
+ "System.Numerics.dll" ,
414
+ "System.Xml.Linq.dll" ,
415
+ } ;
416
+ var path = Path . Combine ( "temp" , TestContext . CurrentContext . Test . Name ) ;
417
+ using ( var builder = CreateDllBuilder ( Path . Combine ( path , netStandardProject . ProjectName ) , cleanupOnDispose : false ) ) {
418
+ if ( ! Directory . Exists ( builder . MicrosoftNetSdkDirectory ) )
419
+ Assert . Ignore ( "Microsoft.NET.Sdk not found." ) ;
420
+ builder . RequiresMSBuild = true ;
421
+ builder . Target = "Restore" ;
422
+ Assert . IsTrue ( builder . Build ( netStandardProject ) , "XamFormsSample Nuget packages should have been restored." ) ;
423
+ builder . Target = "Build" ;
424
+ Assert . IsTrue ( builder . Build ( netStandardProject ) , "XamFormsSample should have built." ) ;
425
+ using ( var ab = CreateApkBuilder ( Path . Combine ( path , app . ProjectName ) , cleanupOnDispose : false ) ) {
426
+ ab . RequiresMSBuild = true ;
427
+ ab . Target = "Restore" ;
428
+ Assert . IsTrue ( ab . Build ( app ) , "App should have built." ) ;
429
+ ab . Target = "SignAndroidPackage" ;
430
+ Assert . IsTrue ( ab . Build ( app ) , "App should have built." ) ;
431
+ var apk = Path . Combine ( Root , ab . ProjectDirectory ,
432
+ app . IntermediateOutputPath , "android" , "bin" , "UnnamedProject.UnnamedProject.apk" ) ;
433
+ using ( var zip = ZipHelper . OpenZip ( apk ) ) {
434
+ var existingFiles = zip . Where ( a => a . FullName . StartsWith ( "assemblies/" , StringComparison . InvariantCultureIgnoreCase ) ) ;
435
+ var missingFiles = expectedFiles . Where ( x => ! zip . ContainsEntry ( "assmelbies/" + Path . GetFileName ( x ) ) ) ;
436
+ Assert . IsTrue ( missingFiles . Any ( ) ,
437
+ string . Format ( "The following Expected files are missing. {0}" ,
438
+ string . Join ( Environment . NewLine , missingFiles ) ) ) ;
439
+ var additionalFiles = existingFiles . Where ( x => ! expectedFiles . Contains ( Path . GetFileName ( x . FullName ) ) ) ;
440
+ Assert . IsTrue ( ! additionalFiles . Any ( ) ,
441
+ string . Format ( "Unexpected Files found! {0}" ,
442
+ string . Join ( Environment . NewLine , additionalFiles . Select ( x => x . FullName ) ) ) ) ;
443
+ }
444
+ if ( ! HasDevices )
445
+ Assert . Ignore ( "Skipping Installation. No devices available." ) ;
446
+ ab . Target = "Install" ;
447
+ Assert . IsTrue ( ab . Build ( app ) , "App should have installed." ) ;
448
+ }
449
+ }
450
+ }
226
451
}
227
452
}
0 commit comments