100% found this document useful (2 votes)
1K views

Download Mobile Development with NET Build cross platform mobile applications with Xamarin Forms 5 and ASP NET Core 5 2nd Edition Can Bilgin ebook All Chapters PDF

Development

Uploaded by

aouiliheil
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
1K views

Download Mobile Development with NET Build cross platform mobile applications with Xamarin Forms 5 and ASP NET Core 5 2nd Edition Can Bilgin ebook All Chapters PDF

Development

Uploaded by

aouiliheil
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 51

Experience Seamless Full Ebook Downloads for Every Genre at textbookfull.

com

Mobile Development with NET Build cross platform


mobile applications with Xamarin Forms 5 and ASP
NET Core 5 2nd Edition Can Bilgin

https://textbookfull.com/product/mobile-development-with-
net-build-cross-platform-mobile-applications-with-xamarin-
forms-5-and-asp-net-core-5-2nd-edition-can-bilgin/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

C 8 0 and NET Core 3 0 Modern Cross Platform Development


Build applications with C NET Core Entity Framework Core
ASP NET Core and ML NET using Visual Studio Code 4th
Edition Mark J. Price
https://textbookfull.com/product/c-8-0-and-net-core-3-0-modern-cross-
platform-development-build-applications-with-c-net-core-entity-
framework-core-asp-net-core-and-ml-net-using-visual-studio-code-4th-
edition-mark-j-price/
textboxfull.com

Beginning Visual Studio for Mac: Build Cross-Platform Apps


with Xamarin and .NET Core Alessandro Del Sole

https://textbookfull.com/product/beginning-visual-studio-for-mac-
build-cross-platform-apps-with-xamarin-and-net-core-alessandro-del-
sole/
textboxfull.com

Pro ASP NET Core Identity Under the Hood with


Authentication and Authorization in ASP NET Core 5 and 6
Applications 1st Edition Adam Freeman
https://textbookfull.com/product/pro-asp-net-core-identity-under-the-
hood-with-authentication-and-authorization-in-asp-net-
core-5-and-6-applications-1st-edition-adam-freeman/
textboxfull.com

Cross-platform Localization for Native Mobile Apps with


Xamarin 1st Edition Christopher Miller

https://textbookfull.com/product/cross-platform-localization-for-
native-mobile-apps-with-xamarin-1st-edition-christopher-miller/

textboxfull.com
Building Microservices with ASP NET Core Develop Test and
Deploy Cross Platform Services in the Cloud 1st Edition
Kevin Hoffman
https://textbookfull.com/product/building-microservices-with-asp-net-
core-develop-test-and-deploy-cross-platform-services-in-the-cloud-1st-
edition-kevin-hoffman/
textboxfull.com

C 7 and NET Core Modern Cross Platform Development 2nd


Edition Mark J. Price

https://textbookfull.com/product/c-7-and-net-core-modern-cross-
platform-development-2nd-edition-mark-j-price/

textboxfull.com

Mobile app development with Ionic cross platform apps with


Ionic Angular and Cordova Griffith

https://textbookfull.com/product/mobile-app-development-with-ionic-
cross-platform-apps-with-ionic-angular-and-cordova-griffith/

textboxfull.com

Modern Data Access with Entity Framework Core: Database


Programming Techniques for .NET, .NET Core, UWP, and
Xamarin with C# 1st Edition Holger Schwichtenberg
https://textbookfull.com/product/modern-data-access-with-entity-
framework-core-database-programming-techniques-for-net-net-core-uwp-
and-xamarin-with-c-1st-edition-holger-schwichtenberg/
textboxfull.com

Modern Data Access with Entity Framework Core: Database


Programming Techniques for . NET, . NET Core, UWP, and
Xamarin with C# 1st Edition Holger Schwichtenberg
https://textbookfull.com/product/modern-data-access-with-entity-
framework-core-database-programming-techniques-for-net-net-core-uwp-
and-xamarin-with-c-1st-edition-holger-schwichtenberg-2/
textboxfull.com
Mobile Development
with .NET
Second Edition

Build cross-platform mobile applications with


Xamarin.Forms 5 and ASP.NET Core 5

Can Bilgin

BIRMINGHAM—MUMBAI
Mobile Development with .NET
Second Edition
Copyright © 2021 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or
transmitted in any form or by any means, without the prior written permission of the publisher,
except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the
information presented. However, the information contained in this book is sold without warranty,
either express or implied. Neither the author, nor Packt Publishing or its dealers and distributors,
will be held liable for any damages caused or alleged to have been caused directly or indirectly by
this book.
Packt Publishing has endeavored to provide trademark information about all of the companies
and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing
cannot guarantee the accuracy of this information.

Associate Group Product Manager: Pavan Ramchandani


Senior Editor: Hayden Edwards
Content Development Editor: Aamir Ahmed
Technical Editor: Shubham Sharma
Copy Editor: Safis Editing
Project Coordinator: Kinjal Bari
Proofreader: Safis Editing
Indexer: Tejal Daruwale Soni
Production Designer: Vijay Kamble

First published: June 2018


Second edition: April 2021

Production reference: 1080421

Published by Packt Publishing Ltd.


Livery Place
35 Livery Street
Birmingham
B3 2PB, UK.

ISBN 978-1-80020-469-0

www.packt.com
To my beloved wife and best friend for life, Sanja.
– Can Bilgin
Contributors
About the author
Can Bilgin is a solution architect, working for Authority Partners Inc. He has been
working in the software industry for almost two decades on various consumer- and
enterprise-level engagements for high-profile clients using technologies such as BizTak,
Service Fabric, Orleans, Dynamics CRM, Xamarin, WCF, Azure services, and other web/
cloud technologies. His passion lies in mobile and IoT development using modern tools
available to developers. He shares his experience on his blog, on social media, and through
speaking engagements at local and international community events. He was recognized as
a Microsoft MVP for his technical contributions between 2014 and 2018.

I want to thank my wife and daughter for their tremendous support during
this project.
About the reviewer
Ahmed Ilyas has 18 years of professional experience in software development.
After leaving Microsoft, he ventured into setting up his own consultancy company,
offering the best possible solutions for a number of industries and providing real-
world answers to those problems. He uses the Microsoft stack to not only build these
technologies to be able to provide the best practices, patterns, and software to his client
base to enable long-term stability and compliance in the ever-changing software industry
but also to improve the skills of software developers around the globe as well as pushing
the limits of technology.
This has led to him being awarded MVP in C# by Microsoft three times for "providing
excellence and independent real-world solutions to problems that developers face."
His great reputation has resulted in him having a large client base for his consultancy
company, Sandler Ltd (UK) and Sandler Software LLC (US), which includes clients
from different industries. Clients have included him on their "approved contractors/
consultants" list as a trusted vendor and partner.
Ahmed Ilyas has also been involved in the past in reviewing books for Packt Publishing
and wishes to thank them for the great opportunity once again.

I would like to thank the author/publisher of this book for giving me the
great honor and privilege of reviewing the book, as well as, especially,
Microsoft Corporation and my colleagues for enabling me to become a
reputable leader as a software and solutions developer in the industry.
Table of Contents

Preface

Section 1:
Understanding .NET
1
Getting Started with .NET 5.0
Technical Requirements 4 Developing with .NET 5.0 9
Exploring cross-platform Creating a runtime-agnostic application 9
development4 Defining a runtime and self-contained
Developing fully native applications 5 deployment14
Hybrid applications 5 Defining a framework 17
Native cross-platform frameworks 6
Summary19
Understanding .NET Core 7

2
Defining Xamarin, Mono, and .NET Standard
Understanding Xamarin 22 Using .NET with Xamarin 35
Setting up Your Development Xamarin.Forms 37
Environment22 Extending the reach 42
Creating your First Xamarin Summary 43
Application25
Xamarin on Android – Mono Droid 26
Xamarin on iOS – Mono Touch 32
ii Table of Contents

3
Developing with Universal Windows Platform
Introducing Universal Windows Native with UWP 54
Platform46 Working with Platform
Creating UWP applications 47 extensions55
Understanding XAML Differences51 Summary57
Using .NET Standard and .NET

Section 2:
Xamarin and Xamarin.Forms
4
Developing Mobile Applications with Xamarin
Technical Requirements 62 implementation72
Choosing between Xamarin Architectural Patterns for
and Xamarin.Forms 62 Unidirectional Data Flow 81

Organizing Xamarin.Forms Useful architectural patterns 83


application projects 64 Inversion of Control  83
Selecting the presentation Event aggregator 84
architecture67 Decorator85
Model-View-Controller (MVC)
implementation68 Summary86
Model-View-ViewModel (MVVM)

5
UI Development with Xamarin
Technical Requirements 88 Implementing navigation
Application layout 88 structure94
Consumer expectations 88 Single-page view 94
Platform imperatives 91 Simple navigation 100
Development cost 93 Multi-page views 103
Table of Contents iii

Master/detail view 109 Creating data-driven views 128


Data binding essentials 128
Implementing Shell Navigation 113
Value converters 130
Using Xamarin.Forms and Triggers 133
native controls 116 Visual states 135
Layouts 116
Xamarin.Forms view elements 123 Collection Views 138
Native components 126 Summary 139

6
Customizing Xamarin.Forms
Technical Requirements 142 Platform specifics 159
Xamarin.Forms development Xamarin.Forms effects 160
domains142 Composite customizations 164

Xamarin.Forms shared Creating Custom Controls 168


domains144 Creating a Xamarin.Forms control 168
Using styles 144 Creating a custom renderer 172
Creating behaviors 148 Creating a custom Xamarin.Forms
Attached properties 154 control178
XAML markup extensions 156
Summary182
Customizing native domains 159

Section 3:
Azure Cloud Services
7
Azure Services for Mobile Applications
An overview of Azure services 186 Azure storage 202
An introduction to distributed systems 186 Cosmos DB 204
Cloud architecture 190 Azure Cache for Redis 205
Azure service providers and resource
Azure Serverless 205
types198
Azure functions 205
Data stores 201 Azure Logic apps 208
Relational database resources 201 Azure Event Grid 209
iv Table of Contents

Development services 209 Visual Studio App Center 211


Azure DevOps 210
Summary212

8
Creating a Datastore with Cosmos DB
Technical Requirements 214 Creating and accessing documents 225
The basics of Cosmos DB 214 Denormalized data 231
Referenced data 234
Global distribution 216
Consistency spectrum 216 Cosmos DB in depth 236
Pricing219
Partitioning 236
Data access models 220 Indexing 239
Programmability241
The SQL API 220
The change feed 245
The MongoDB API 220
Others224 Summary245
Modeling data 224

9
Creating Microservices Azure App Services
Technical requirements 248 Implementing a soft delete 267
Choosing the right app model 248 Integrating with Redis cache 268
Azure virtual machines 249
Hosting the services 271
Containers in Azure 250
Azure Web App for App Service 271
Microservices with Azure
Containerizing services 274
Service Fabric 251
Azure App Service 252 Securing the application 277
Creating our first microservice 253 ASP.NET Core Identity 279
Azure AD 280
Initial setup 253
Azure AD B2C 285
Implementing retrieval actions 256
Implementing update methods 264 Summary286
Table of Contents v

10
Using .NET Core for Azure Serverless
Understanding Azure Using connectors 304
Serverless288 Creating our first Logic App 305
Developing Azure Functions 288 Workflow execution control 310
Using Azure Function Runtimes 289 Integration with Azure services 313
Function triggers and bindings 294
Repository 313
Configuring functions 295
Queue-based processing 314
Hosting functions 296
Event aggregation 315
Creating our first Azure function 297
Summary 316
Developing a Logic App 300
Implementing Logic Apps 301

Section 4:
Advanced Mobile Development
11
Fluid Applications with Asynchronous Patterns
Utilizing tasks and awaitables 320 Asynchronous event handling 344
Task-based execution 321 The asynchronous command 346
Synchronization context 327
Native asynchronous
Single execution guarantee 329
execution 349
Logical tasks 331
Android services 349
The command pattern 332
iOS backgrounding 350
Creating producers/consumers 335
Using observables and data streams 337 Summary 352
Asynchronous execution
patterns 342
Service initialization pattern 342
vi Table of Contents

12
Managing Application Data
Improving HTTP performance SQLite.NET 361
with transient caching 354 Entity Framework Core 363
Client cache aside 355
Data access patterns 364
Entity tag (ETag) validation 357
Implementing the repository pattern 365
Key/value store 359
Observable repository 367
Persistent relational
data cache 361 Summary 373

13
Engaging Users with Notifications and the Graph API
Understanding Native Device registration 384
Notification Services 376 Transmitting notifications 388
Notification providers 376 Broadcasting to multiple devices 390
Sending notifications with PNS 377 Advanced scenarios 391
General constraints 378
The Graph API and
Azure Notification Hubs 379 Project Rome 393
Notification Hubs infrastructure 379 The Graph API 393
Notifications using Azure Notification Project Rome 393
Hubs 381
Summary 396
Creating a notification service 383
Defining the requirements 383

Section 5:
Application Life Cycle Management
14
Azure DevOps and Visual Studio App Center
Using Azure DevOps and Git 400 Branching strategy 402
Creating a Git repository with Managing development branches 404
Azure DevOps 400
Table of Contents vii

Creating Xamarin application Setting up distribution rings 420


packages408
Distributing with App Center 422
Using Xamarin build templates 409
App Center releases 422
Environment-specific configurations 416
AppCenter distribution groups 423
Creating and utilizing artifacts 416
App Center distribution to production 424
App Center for Xamarin 417
App Center telemetry and
Integrating with the source
repository and builds 418
diagnostics  425
Summary427

15
Application Telemetry with Application Insights
Collecting insights for Xamarin Application Insights data model 443
applications 430 Collecting telemetry data with
The telemetry data model 430 ASP.NET Core 444
Advanced application telemetry 435 Collecting telemetry with Azure
Functions449
Exporting App Center telemetry
data to Azure 440
Analyzing data 451
Collecting telemetry data for Summary454
Azure Service 443

16
Automated Testing
Maintaining application Implementing platform tests 473
integrity with tests 456
Automated UI tests 473
Arrange, Act, and Assert 456
Xamarin.UITests474
Creating unit tests with mocks 462
Page Object Pattern 477
Fixtures and data-driven tests 466
Summary481
Maintaining cross-module
integrity with integration tests 469
Testing client-server communication 469
viii Table of Contents

17
Deploying Azure Modules
Creating an ARM template 484 Deploying .NET
ARM template concepts 491 Core applications 499
Using Azure DevOps for ARM Summary 503
templates495

18
CI/CD with Azure DevOps
Introducing CI/CD 506 Testing519
CI/CD with GitFlow 508 Static code analysis with SonarQube 520

Development509 Creating and using release


Pull request/merge 510 templates525
The CI phase 512 Azure DevOps releases 525
Release branch 515 Xamarin release template 531
Hotfix branches 516 Azure web application release 533
Production517
Summary 534
The QA process 517
Why subscribe? 537
Code review 518
Other Books You May Enjoy
Index
Preface
In this book, you will learn how to design and develop highly attractive, maintainable and
robust mobile applications for multiple platforms, including iOS, Android and UWP, with
the toolset provided by Microsoft using Xamarin, .NET 5 and the Azure cloud services.
The book will not only provide practical examples and walkthroughs but also useful
insights about cloud and mobile architectural patterns. You will also learn about most
effective ways to manage the lifecycle of your mobile projects using the latest tools and
platforms modern DevOps ecosystem has to offer.

Who this book is for


This book is for mobile developers who wish to develop cross-platform mobile
applications. Programming experience with C# is required. Some knowledge and
understanding of core elements and cross-platform application development with .NET is
required.

What this book covers


Chapter 1, Getting Started with .NET 5.0, gives you a brief introduction to .NET Core
while explaining the different tiers of the .NET infrastructure. Languages, runtimes, and
extensions that can be used together with .NET will be discussed and analyzed.
Chapter 2, Defining Xamarin, Mono, and .NET Standard, explains the relationship between
.NET Core and Xamarin. You will learn about how the Xamarin source code is executed
with MonoTouch on iOS and the Mono runtime on Android.
Chapter 3, Developing with Universal Windows Platform, discusses the components that
allow UWP apps to be portable within the Windows 10 ecosystem and how they are
associated with .NET Core.
Chapter 4, Developing Mobile Applications with Xamarin, explains Xamarin and
Xamarin.Forms development strategies, and we will create a Xamarin.Forms application
that we will develop throughout the remainder of the book. We will also discuss the
architectural models that might help us along the way.
x Preface

Chapter 5, UI Development with Xamarin, takes a look at certain UI patterns that allow
developers and user experience designers to come to a compromise between the user
expectations and product demands in order to create a platform and product with a
consistent user experience across platforms.
Chapter 6, Customizing Xamarin.Forms, goes through the steps and procedures of
customizing Xamarin.Forms without compromising on the performance or user
experience. Some of the features that will be analyzed include effects, behaviors,
extensions, and custom renderers.
Chapter 7, Azure Services for Mobile Applications, discusses the fact that there are a
number of services that are offered as services (SaaS), platform (PaaS), or infrastructure
(IaaS), such as Notification Hubs, Cognitive Services, and Azure Functions, that can
change the impressions of users regarding your application with little or no additional
development hours. This chapter will give you a quick overview of using some of these
services when developing .NET Core applications.
Chapter 8, Creating a Datastore with Cosmos DB, explains how Cosmos DB offers a multi-
model and multi-API paradigm that allows applications to use multiple data models
while storing application data with the most suitable API for the application, such as SQL,
JavaScript, Gremlin, and MongoDB. In this chapter, we will create the datastore for our
application and implement the data access modules.
Chapter 9, Creating Microservices Azure App Services, goes through the basics of Azure
App Service, and we will create a simple, data-oriented backend for our application using
ASP.NET Core with authentication provided by Azure Active Directory. Additional
implementation will include offline sync and push notifications.
Chapter 10, Using .NET Core for Azure Serverless, shows how to incorporate Azure
Functions into our infrastructure to process data on different triggers, and how to
integrate Azure Functions with a logic app that will be used as a processing unit in our
setup.
Chapter 11, Fluid Applications with Asynchronous Patterns, explains that when developing
Xamarin applications and ASP.NET Core applications, both the task's framework and
the reactive modules can help distribute the execution threads and create a smooth and
uninterrupted execution flow. This chapter will go over some of the patterns associated
with these modules and apply them to various sections of the application.
Preface xi

Chapter 12, Managing Application Data, explains that in order to avoid data conflicts
and synchronization issues, developers must be diligent regarding the procedures
implemented according to the type of data at hand. This chapter will discuss the possible
data synchronization and offline storage scenarios using products such as SQLite and
Entity Framework Core, as well as the out-of-the-box offline support provided by Azure
App Service.
Chapter 13, Engaging Users with Notifications and the Graph API, briefly explains how
notifications and the graph API can be used to improve user engagement by taking
advantage of push notifications and the graph API. We will create a notification
implementation for cross-platform applications using Azure Notification Hubs. We will
also create so-called activity entries for our application sessions so that we can create a
timeline that is accessible on multiple platforms.
Chapter 14, Azure DevOps and Visual Studio App Center, shows how to use Visual Studio
Team Services and App Center to set up a complete, automated pipeline for Xamarin
applications that will connect the source repository to the final store submission.
Chapter 15, Application Telemetry with Application Insights, explains how Application
Insights is a great candidate for collecting telemetry from Xamarin applications that use
an Azure-hosted web service infrastructure because of its intrinsic integration with Azure
modules, as well as the continuous export functionality for App Center telemetry.
Chapter 16, Automated Testing, discusses how to create unit and coded UI tests, and
the architectural patterns that revolve around them. Data-driven unit tests, mocks, and
Xamarin UI tests are some of the concepts that will be discussed.
Chapter 17, Deploying Azure Modules, demonstrates how to configure the ARM template
for the Azure web service implementation, as well as other services (such as Cosmos DB
and Notification Hubs) that we used previously so that we can create deployments using
the Visual Studio Team Services build and release pipeline. Introducing configuration
values into the template and preparing it to create staging environments are our primary
focuses in this chapter.
Chapter 18, CI/CD with Azure DevOps, explains how developers can create fully
automated templates for builds, testing, and deployments using the toolset provided with
Visual Studio Team Services. In this chapter, we will set up the build and release pipeline
for Xamarin in line with the Azure deployment pipeline.
xii Preface

To get the most out of this book


The book is primarily aimed at .NET developers with slim to moderate experience with
Xamarin and .NET. The cloud infrastructure-related sections heavily use various services
in the Azure cloud infrastructure. However, familiarity with the basic management
concepts of the Azure portal should be enough for the more advanced topics.
For the code samples, a combination of Windows and macOS development environments
is used throughout the book. The ideal setup to utilize the samples would be to use macOS
together with a Windows 10 virtual machine. This way, samples from both environments
can be used.

The IDE of choice for implementing the code walk-throughs is Visual Studio 2019 on
Windows and Visual Studio for Mac on macOS. Visual Studio Code, which supports both
platforms, can be used to create the scripting and Python examples.
If you are using the digital version of this book, we advise you to type the code yourself
or access the code via the GitHub repository (link available in the next section). Doing
so will help you avoid any potential errors related to the copying and pasting of code.

Download the example code files


You can download the example code files for this book from GitHub at https://
github.com/PacktPublishing/Mobile-Development-with-.
NET-Second-Edition. In case there's an update to the code, it will be updated on the
existing GitHub repository.
We also have other code bundles from our rich catalog of books and videos available at
https://github.com/PacktPublishing/. Check them out!
Preface xiii

Conventions used
There are a number of text conventions used throughout this book.
Code in text: Indicates code words in text, database table names, folder names,
filenames, file extensions, pathnames, dummy URLs, user input, and Twitter handles.
Here is an example: "The IObserver and IObservable interfaces, which form the
basis for observables and so-called reactive patterns."
A block of code is set as follows:

namespace FirstXamarinFormsApplication
{
public partial class MainPage : ContentPage
{
InitializeComponent();
BindingContext = new MainPageViewModel();
}
}

When we wish to draw your attention to a particular part of a code block, the relevant
lines or items are set in bold:

public App()
{
InitializeComponent();
MainPage = NavigationPage(new ListItemView())
}

Any command-line input or output is written as follows:

$ docker run -p 8000:80 netcore-usersapi

Bold: Indicates a new term, an important word, or words that you see onscreen. For
example, words in menus or dialog boxes appear in the text like this. Here is an example:
"Both the ALM process and the version control options are available under the Advanced
section of the project settings."

Tips or important notes


Appear like this.
xiv Preface

Get in touch
Feedback from our readers is always welcome.
General feedback: If you have questions about any aspect of this book, mention the book
title in the subject of your message and email us at [email protected].
Errata: Although we have taken every care to ensure the accuracy of our content, mistakes
do happen. If you have found a mistake in this book, we would be grateful if you would
report this to us. Please visit www.packtpub.com/support/errata, selecting your
book, clicking on the Errata Submission Form link, and entering the details.
Piracy: If you come across any illegal copies of our works in any form on the Internet,
we would be grateful if you would provide us with the location address or website name.
Please contact us at [email protected] with a link to the material.
If you are interested in becoming an author: If there is a topic that you have expertise in
and you are interested in either writing or contributing to a book, please visit authors.
packtpub.com.

Reviews
Please leave a review. Once you have read and used this book, why not leave a review on
the site that you purchased it from? Potential readers can then see and use your unbiased
opinion to make purchase decisions, we at Packt can understand what you think about
our products, and our authors can see your feedback on their book. Thank you!
For more information about Packt, please visit packt.com.
Section 1:
Understanding .NET

The fundamental requirement for implementing cross-platform applications with


Xamarin is to understand the .NET ecosystem and the supporting Microsoft stack. This
part of the book specifically walks you through the evolution of .NET and how it can
efficiently be utilized for mobile projects.
This section comprises the following chapters:

• Chapter 1, Getting Started with .NET 5.0


• Chapter 2, Defining Xamarin, Mono, and .NET Standard
• Chapter 3, Developing with Universal Windows Platform
1
Getting Started with
.NET 5.0
.NET Core (previously known as .NET vNext) is the general umbrella term used
for Microsoft's cross-platform toolset that aims to solve the shortcomings of
centralized/machine-wide frameworks (classic .NET Framework) by creating a portable,
platform-agnostic, modular runtime and framework. This decentralized development
platform, which is replacing the classic .NET Framework starting with v5.0, allows
developers to create applications for multiple platforms using the common .NET base
class libraries (implementation of the .NET standard), as well as various runtimes and
application models, depending on the target platforms.
This chapter will give you a brief introduction to the new .NET Framework while
explaining different tiers of the .NET Core infrastructure. The combination of .NET Core,
.NET Standard, and Xamarin is the key to cross-platform projects and opens many doors
that were previously only available to Windows developers. The ability to create web
applications that can run on Linux machines and containers, and the implementation
of mobile applications that target iOS, Android, Universal Windows Platform (UWP),
and Tizen, are just a couple of examples designed to emphasize the capabilities of this
cross-platform approach.
4 Getting Started with .NET 5.0

In this chapter, we will analyze cross-platform development tools and frameworks for
mobile applications and take an initial look at .NET Core development.
The following sections will guide you through getting started with .NET 5.0:

• Exploring cross-platform development


• Understanding .NET Core
• Developing with .NET 5.0

Technical Requirements
You can find the code used in this chapter through the following GitHub link:
https://github.com/PacktPublishing/Mobile-Development-with-.
NET-Second-Edition/tree/master/chapter01/src.

Exploring cross-platform development


The term cross-platform application development refers to the process of creating a
software application that can run on multiple operating systems. In this book, we will not
try to answer the question of why, but how to develop cross-platform applications – more
specifically, we will try to create a cross-platform application using the toolset provided by
Microsoft and .NET Core.
Before we start talking about .NET Core, let's take a look at the process of developing
an application for multiple platforms. Faced with the cross-platform requirement, the
product team can choose multiple paths that will lead the developers through different
application life cycles.
Throughout this book, we will have hypothetical user stories defined for various scenarios.
We will start with an overall user story that underlines the importance of .NET Core:

"I, as a product owner, would like to have my consumer app running on


iOS and Android mobile platforms, as well as Windows, Linux, and macOS
desktop runtimes, so that I can increase my reach and user base."
Exploring cross-platform development 5

In order to meet these demands, we can choose to implement the application in several
different ways:

• Fully native applications


• Hybrid applications
• Cross-platform

Let's take a look at each of these methods.

Developing fully native applications


Following this path would create probably the most performant application, with
increased accessibility to platform APIs for developers. However, the development
team for this type of development would require a wider range of skills so that the same
application can be created on multiple platforms. Development on multiple platforms
would also increase the developer hours that need to be invested in the application.
Considering the scenario presented in the previous section, we would potentially
need to develop the client application in Cocoa and CocoaTouch (macOS and iOS),
Java (Android), .NET (Windows), and C++ (Linux), and finally build a web service
infrastructure using another development platform of our choice. In other words, this
approach is, in fact, implementing a multi-platform application rather than a cross-
platform one.

Hybrid applications
Native hosted web applications (also known as hybrid applications) are another
popular choice for (especially mobile) developers. In this architecture, a responsive web
application would be hosted on a thin native harness on the target platform. The native
web container would also be responsible for providing access to the web runtime on
native platform APIs. These hybrid applications wouldn't even need to be packaged as
application packages, but as Progressive Web Apps (PWAs) so that users can access
them directly from their web browsers. While the development resources are used more
efficiently than in the native cross-platform framework approach, this type of application
is generally prone to performance issues.
In reference to the business requirements at hand, we would probably develop a web
service layer and a small Single - Page Application (SPA), part of which is packaged
as a hybrid application.
6 Getting Started with .NET 5.0

Native cross-platform frameworks


Development platforms such as React Native, Xamarin, and .NET Core provide the
much-required abstraction for the target platforms, so that development can be
done using one framework and one development kit for multiple runtimes. In other
words, developers can still use the APIs provided by the native platform (for example,
the Android or iOS SDK), but development is executed using a single language and
framework. This approach not only decreases development resources, but also saves you
from the burden of managing multiple source repositories for multiple platforms. This
way, the same source is used to create multiple application heads.
For instance, using .NET Core, the development team can implement all target platforms
using the same development suite, thereby creating multiple client applications for each
target platform, as well as the web service infrastructure.
In a cross-platform implementation, architecturally speaking, the application is made up
of three distinct tiers:

• Application model (the implementation layer for the consumer application)


• Framework (the toolset available for developers)
• Platform abstraction (the harness or runtime to host the application)

In this context, we, in essence, are in pursuit of creating a platform-agnostic application


layer that will be catered for on a platform abstraction layer. The platform abstraction
layer, whether we are dealing with a native web host or a native cross-platform framework,
is responsible for providing the bridge between the single application implementation and
the polymorphic runtime component.
.NET Core and Mono provide the runtime, while .NET Standard provides the framework
abstraction, which means that cross-platform applications can be implemented and
distributed on multiple platforms. Using Xamarin with the .NET Standard framework
on mobile applications and .NET Core on the web infrastructure, sophisticated cloud-
supported native mobile applications can be created.
As you can easily observe, native cross-platform frameworks offer the optimal
compromise between development costs, performance, and the nativeness of the target
application, providing developers with an ideal option for creating applications for
multiple platforms. From this perspective, .NET (Core) and Xamarin, which together
evolved into a cross-platform framework and runtime, has become one of the most
prominent development platforms for mobile applications.
Understanding .NET Core 7

We have discussed different ways to implement cross - platform applications and


identified the pros and cons of these methodologies. We can now start exploring the .NET
ecosystem and cross-platform toolset.

Understanding .NET Core


In order to understand the origins of, and motivation for, .NET Core, let's start with a
quote:

"Software producers who maximize their product's potential for useful


combination with other software, while at the same time minimizing any
restrictions upon its further re-combination, will be the survivors within
a software industry that is in the process of reorganizing itself around the
network exchange of commodity data."

– David Stutz – General Program Manager for Shared Source Common


Language Infrastructure, Microsoft, 2004.
.NET Core dates back as early as 2001 when Shared Source Common Language
Infrastructure (SSCLI) was shared sourced (not for commercial use) under the code
name Rotor. This was the ECMA 335, that is, the Common Language Infrastructure
(CLI) standard implementation. Rotor could be built on FreeBSD (version 4.7 or newer)
and macOS X 10.2. It was designed in such a way that a thin Platform Abstraction Layer
(PAL) was the only thing that was needed to port the CLI to a different platform. This
release constitutes the initial steps to migrate .NET to a cross-platform infrastructure.
2001 was also the year the Mono project was born as an open source project that ports
parts of .NET to the Linux platform as a development platform infrastructure. In 2004,
the initial version of Mono was released for Linux, which would lead to ports on other
platforms such as iOS (MonoTouch) and Android (MonoDroid), and would eventually be
merged into the .NET ecosystem under the Xamarin name.
One of the driving forces behind this approach was the fact that the .NET framework
was designed and distributed as a system-wide monolithic framework. Applications that
are dependent on only a small portion of the framework required the complete framework
to be installed on the target operating system. It did not support application-only
scenarios where different applications can be run on different versions without having
to install a system-wide upgrade. However, more importantly, applications that were
developed with .NET were implicitly bound to Windows because of the tight coupling
between the .NET Framework and Windows API components. .NET Core was born out
of these incentives and opened up the doors of various platforms for .NET developers.
8 Getting Started with .NET 5.0

Finally, in 2020, .NET Core replaced classic .NET. The unified .NET platform now
provides developers with a single runtime and framework that can be used to create
cross-platform applications using a single code base.
Semantically speaking, .NET now describes the complete infrastructure for the whole set
of cross-development tools that rely on a common language infrastructure and multiple
runtimes, including .NET Core Runtime, .NET, also known as Big CLR, the Mono
runtime, and Xamarin:

Figure 1.1 – .NET Ecosystem


In this setup, the .NET CLI (Common Language Infrastructure) is made up of the base
class library implementation, which defines the standards that need to be provided by
the supported runtimes. The base class library is responsible for providing the PAL,
which is provided by the hosting runtime under the name of the Adaption Layer. This
infrastructure is supported by compiler services such as Roslyn and Mono Compiler
(MCS), as well as Just-In-Time (JIT) and Ahead-of-Time (AOT) compilers such as
RyuJIT (.NET Core), mTouch, and LLVM (for Xamarin.iOS) in order to produce and
execute the application binaries for the target platform.
Overall, .NET Core is a rapidly growing ecosystem with a large number of supported
platforms, runtimes, and tools. Most of these components can be found on GitHub as
open source projects under the supervision of the .NET Foundation. This open source
growth is one of the key factors behind .NET Core reaching its peak today, where the
implemented APIs almost fully match those of .NET Framework. This is why the
.NET 5.0 release marks the end of the .NET era (as we know it) since the two .NET
frameworks are being merged into one in this release, where .NET Core, de facto,
replaces .NET itself. Let's now, without further ado, start developing in .NET 5.0.
Another Random Scribd Document
with Unrelated Content
On the Red Staircase, 12mo, $1.25
“A most vivid and absorbing tale of love and
adventure.”
The Churchman, New York

An Imperial Lover, 12mo, $1.25


“Skillfully constructed, well written, and thoroughly
interesting.”
The Spectator, London

A Yankee Volunteer, 12mo, $1.25


“A story fraught with such exquisite beauty as is
seldom associated with history.”
Boston Times
Sold by all booksellers, or mailed on receipt of price by
the publishers,

A. C. McCLURG & CO., Chicago


By KATHARINE TYNAN
Author of “The Handsome Brandons,” etc.

The Dear Irish Girl


12mo. $1.50.
The very title of this work piques a curiosity and interest
which the perusal of the story is sure to satisfy. A more
charming story of the educated and refined circles of
the Irish people it would be hard to imagine, and the
reader is strongly impressed with the belief that the
heroine is most appropriately named in the title.
It has delightful bits of character, quaint pictures of places
and people, the true Irish atmosphere of sunny innocence
and quick mirthfulness, the social ease and insouciance,
the ready wit which is not to be analyzed—all the
characteristics we look for are there.—The World, London,
Eng.
This book is written with delicate literary taste.—The
Outlook, New York.
Reflects the fresh, buoyant atmosphere of the emerald
isle.—Boston Times.
A tale that American girl readers will heartily enjoy.—The
Living Age, Boston.

She Walks in Beauty


12mo. $1.50.
Those who read with pleasure a love story where there is
plenty of delightful mirth to qualify the sentiment,
exquisite nature touches, and interest in the tale which
never flags, will thank Miss Tynan for the new treat she
affords them in this book.
Charming as are all this delightful author’s pictures of Irish
life, she has never produced a more beautiful story than
the present.—The Courier, Manchester, Eng.

Sold by all booksellers, or mailed on receipt of price, by

A. C. McCLURG & CO., Publishers


CHICAGO
TRANSCRIBER’S NOTES:
Obvious typographical errors have been corrected.
Inconsistencies in hyphenation have been
standardized.
Archaic or variant spelling has been retained.
*** END OF THE PROJECT GUTENBERG EBOOK THE CARDINAL'S
MUSKETEER ***

Updated editions will replace the previous one—the old editions


will be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States
copyright in these works, so the Foundation (and you!) can copy
and distribute it in the United States without permission and
without paying copyright royalties. Special rules, set forth in the
General Terms of Use part of this license, apply to copying and
distributing Project Gutenberg™ electronic works to protect the
PROJECT GUTENBERG™ concept and trademark. Project
Gutenberg is a registered trademark, and may not be used if
you charge for an eBook, except by following the terms of the
trademark license, including paying royalties for use of the
Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such
as creation of derivative works, reports, performances and
research. Project Gutenberg eBooks may be modified and
printed and given away—you may do practically ANYTHING in
the United States with eBooks not protected by U.S. copyright
law. Redistribution is subject to the trademark license, especially
commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

To protect the Project Gutenberg™ mission of promoting the


free distribution of electronic works, by using or distributing this
work (or any other work associated in any way with the phrase
“Project Gutenberg”), you agree to comply with all the terms of
the Full Project Gutenberg™ License available with this file or
online at www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand,
agree to and accept all the terms of this license and intellectual
property (trademark/copyright) agreement. If you do not agree
to abide by all the terms of this agreement, you must cease
using and return or destroy all copies of Project Gutenberg™
electronic works in your possession. If you paid a fee for
obtaining a copy of or access to a Project Gutenberg™
electronic work and you do not agree to be bound by the terms
of this agreement, you may obtain a refund from the person or
entity to whom you paid the fee as set forth in paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only


be used on or associated in any way with an electronic work by
people who agree to be bound by the terms of this agreement.
There are a few things that you can do with most Project
Gutenberg™ electronic works even without complying with the
full terms of this agreement. See paragraph 1.C below. There
are a lot of things you can do with Project Gutenberg™
electronic works if you follow the terms of this agreement and
help preserve free future access to Project Gutenberg™
electronic works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright
law in the United States and you are located in the United
States, we do not claim a right to prevent you from copying,
distributing, performing, displaying or creating derivative works
based on the work as long as all references to Project
Gutenberg are removed. Of course, we hope that you will
support the Project Gutenberg™ mission of promoting free
access to electronic works by freely sharing Project Gutenberg™
works in compliance with the terms of this agreement for
keeping the Project Gutenberg™ name associated with the
work. You can easily comply with the terms of this agreement
by keeping this work in the same format with its attached full
Project Gutenberg™ License when you share it without charge
with others.

1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside
the United States, check the laws of your country in addition to
the terms of this agreement before downloading, copying,
displaying, performing, distributing or creating derivative works
based on this work or any other Project Gutenberg™ work. The
Foundation makes no representations concerning the copyright
status of any work in any country other than the United States.

1.E. Unless you have removed all references to Project


Gutenberg:

1.E.1. The following sentence, with active links to, or other


immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project
Gutenberg™ work (any work on which the phrase “Project
Gutenberg” appears, or with which the phrase “Project
Gutenberg” is associated) is accessed, displayed, performed,
viewed, copied or distributed:

This eBook is for the use of anyone anywhere in the United


States and most other parts of the world at no cost and
with almost no restrictions whatsoever. You may copy it,
give it away or re-use it under the terms of the Project
Gutenberg License included with this eBook or online at
www.gutenberg.org. If you are not located in the United
States, you will have to check the laws of the country
where you are located before using this eBook.

1.E.2. If an individual Project Gutenberg™ electronic work is


derived from texts not protected by U.S. copyright law (does not
contain a notice indicating that it is posted with permission of
the copyright holder), the work can be copied and distributed to
anyone in the United States without paying any fees or charges.
If you are redistributing or providing access to a work with the
phrase “Project Gutenberg” associated with or appearing on the
work, you must comply either with the requirements of
paragraphs 1.E.1 through 1.E.7 or obtain permission for the use
of the work and the Project Gutenberg™ trademark as set forth
in paragraphs 1.E.8 or 1.E.9.

1.E.3. If an individual Project Gutenberg™ electronic work is


posted with the permission of the copyright holder, your use and
distribution must comply with both paragraphs 1.E.1 through
1.E.7 and any additional terms imposed by the copyright holder.
Additional terms will be linked to the Project Gutenberg™
License for all works posted with the permission of the copyright
holder found at the beginning of this work.

1.E.4. Do not unlink or detach or remove the full Project


Gutenberg™ License terms from this work, or any files
containing a part of this work or any other work associated with
Project Gutenberg™.

1.E.5. Do not copy, display, perform, distribute or redistribute


this electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the
Project Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if
you provide access to or distribute copies of a Project
Gutenberg™ work in a format other than “Plain Vanilla ASCII” or
other format used in the official version posted on the official
Project Gutenberg™ website (www.gutenberg.org), you must,
at no additional cost, fee or expense to the user, provide a copy,
a means of exporting a copy, or a means of obtaining a copy
upon request, of the work in its original “Plain Vanilla ASCII” or
other form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™
works unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or


providing access to or distributing Project Gutenberg™
electronic works provided that:

• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”

• You provide a full refund of any money paid by a user who


notifies you in writing (or by e-mail) within 30 days of receipt
that s/he does not agree to the terms of the full Project
Gutenberg™ License. You must require such a user to return or
destroy all copies of the works possessed in a physical medium
and discontinue all use of and all access to other copies of
Project Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full refund of


any money paid for a work or a replacement copy, if a defect in
the electronic work is discovered and reported to you within 90
days of receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project


Gutenberg™ electronic work or group of works on different
terms than are set forth in this agreement, you must obtain
permission in writing from the Project Gutenberg Literary
Archive Foundation, the manager of the Project Gutenberg™
trademark. Contact the Foundation as set forth in Section 3
below.

1.F.

1.F.1. Project Gutenberg volunteers and employees expend


considerable effort to identify, do copyright research on,
transcribe and proofread works not protected by U.S. copyright
law in creating the Project Gutenberg™ collection. Despite these
efforts, Project Gutenberg™ electronic works, and the medium
on which they may be stored, may contain “Defects,” such as,
but not limited to, incomplete, inaccurate or corrupt data,
transcription errors, a copyright or other intellectual property
infringement, a defective or damaged disk or other medium, a
computer virus, or computer codes that damage or cannot be
read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except


for the “Right of Replacement or Refund” described in
paragraph 1.F.3, the Project Gutenberg Literary Archive
Foundation, the owner of the Project Gutenberg™ trademark,
and any other party distributing a Project Gutenberg™ electronic
work under this agreement, disclaim all liability to you for
damages, costs and expenses, including legal fees. YOU AGREE
THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT
EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE
THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY
DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE
TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL,
PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE
NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you


discover a defect in this electronic work within 90 days of
receiving it, you can receive a refund of the money (if any) you
paid for it by sending a written explanation to the person you
received the work from. If you received the work on a physical
medium, you must return the medium with your written
explanation. The person or entity that provided you with the
defective work may elect to provide a replacement copy in lieu
of a refund. If you received the work electronically, the person
or entity providing it to you may choose to give you a second
opportunity to receive the work electronically in lieu of a refund.
If the second copy is also defective, you may demand a refund
in writing without further opportunities to fix the problem.

1.F.4. Except for the limited right of replacement or refund set


forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’,
WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.

1.F.5. Some states do not allow disclaimers of certain implied


warranties or the exclusion or limitation of certain types of
damages. If any disclaimer or limitation set forth in this
agreement violates the law of the state applicable to this
agreement, the agreement shall be interpreted to make the
maximum disclaimer or limitation permitted by the applicable
state law. The invalidity or unenforceability of any provision of
this agreement shall not void the remaining provisions.

1.F.6. INDEMNITY - You agree to indemnify and hold the


Foundation, the trademark owner, any agent or employee of the
Foundation, anyone providing copies of Project Gutenberg™
electronic works in accordance with this agreement, and any
volunteers associated with the production, promotion and
distribution of Project Gutenberg™ electronic works, harmless
from all liability, costs and expenses, including legal fees, that
arise directly or indirectly from any of the following which you
do or cause to occur: (a) distribution of this or any Project
Gutenberg™ work, (b) alteration, modification, or additions or
deletions to any Project Gutenberg™ work, and (c) any Defect
you cause.

Section 2. Information about the Mission


of Project Gutenberg™
Project Gutenberg™ is synonymous with the free distribution of
electronic works in formats readable by the widest variety of
computers including obsolete, old, middle-aged and new
computers. It exists because of the efforts of hundreds of
volunteers and donations from people in all walks of life.

Volunteers and financial support to provide volunteers with the


assistance they need are critical to reaching Project
Gutenberg™’s goals and ensuring that the Project Gutenberg™
collection will remain freely available for generations to come. In
2001, the Project Gutenberg Literary Archive Foundation was
created to provide a secure and permanent future for Project
Gutenberg™ and future generations. To learn more about the
Project Gutenberg Literary Archive Foundation and how your
efforts and donations can help, see Sections 3 and 4 and the
Foundation information page at www.gutenberg.org.

Section 3. Information about the Project


Gutenberg Literary Archive Foundation
The Project Gutenberg Literary Archive Foundation is a non-
profit 501(c)(3) educational corporation organized under the
laws of the state of Mississippi and granted tax exempt status
by the Internal Revenue Service. The Foundation’s EIN or
federal tax identification number is 64-6221541. Contributions
to the Project Gutenberg Literary Archive Foundation are tax
deductible to the full extent permitted by U.S. federal laws and
your state’s laws.

The Foundation’s business office is located at 809 North 1500


West, Salt Lake City, UT 84116, (801) 596-1887. Email contact
links and up to date contact information can be found at the
Foundation’s website and official page at
www.gutenberg.org/contact
Section 4. Information about Donations to
the Project Gutenberg Literary Archive
Foundation
Project Gutenberg™ depends upon and cannot survive without
widespread public support and donations to carry out its mission
of increasing the number of public domain and licensed works
that can be freely distributed in machine-readable form
accessible by the widest array of equipment including outdated
equipment. Many small donations ($1 to $5,000) are particularly
important to maintaining tax exempt status with the IRS.

The Foundation is committed to complying with the laws


regulating charities and charitable donations in all 50 states of
the United States. Compliance requirements are not uniform
and it takes a considerable effort, much paperwork and many
fees to meet and keep up with these requirements. We do not
solicit donations in locations where we have not received written
confirmation of compliance. To SEND DONATIONS or determine
the status of compliance for any particular state visit
www.gutenberg.org/donate.

While we cannot and do not solicit contributions from states


where we have not met the solicitation requirements, we know
of no prohibition against accepting unsolicited donations from
donors in such states who approach us with offers to donate.

International donations are gratefully accepted, but we cannot


make any statements concerning tax treatment of donations
received from outside the United States. U.S. laws alone swamp
our small staff.

Please check the Project Gutenberg web pages for current


donation methods and addresses. Donations are accepted in a
number of other ways including checks, online payments and
credit card donations. To donate, please visit:
www.gutenberg.org/donate.

Section 5. General Information About


Project Gutenberg™ electronic works
Professor Michael S. Hart was the originator of the Project
Gutenberg™ concept of a library of electronic works that could
be freely shared with anyone. For forty years, he produced and
distributed Project Gutenberg™ eBooks with only a loose
network of volunteer support.

Project Gutenberg™ eBooks are often created from several


printed editions, all of which are confirmed as not protected by
copyright in the U.S. unless a copyright notice is included. Thus,
we do not necessarily keep eBooks in compliance with any
particular paper edition.

Most people start at our website which has the main PG search
facility: www.gutenberg.org.

This website includes information about Project Gutenberg™,


including how to make donations to the Project Gutenberg
Literary Archive Foundation, how to help produce our new
eBooks, and how to subscribe to our email newsletter to hear
about new eBooks.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like