.NET Conf 2021 Keynote

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments

Hmm. Wonder if there'll be any surprise features like how we got Web Forms Dependency Injection support in .NET 4.7.2.

(Pretty please make ASMX web services finally respect Application_Error.)

👍︎︎ 13 👤︎︎ u/HamsterExAstris 📅︎︎ Nov 14 2021 🗫︎ replies

I'm really not liking minimal APIs. Just because you can put the whole application in a single file doesn't mean you should.

👍︎︎ 10 👤︎︎ u/grauenwolf 📅︎︎ Nov 14 2021 🗫︎ replies

I'm not sure why Server Side Blazor still exists. It looks like WASM Blazor in .NET 6 now addresses all of the problems that I had with the previous version.

👍︎︎ 4 👤︎︎ u/grauenwolf 📅︎︎ Nov 14 2021 🗫︎ replies
Captions
>> Welcome to.NET Conf 2021. I'm Scott Hunter, the VP of Product at Microsoft, on Azure and.NET. I'm excited to be here today to share all the cool things that we built with community, and.NET 6. First-off,.NET 6 is a unified platform, that's one SDK, one runtime, once at a base libraries to build all these crazy app types, whether it's Cloud, web, desktop, mobile, gaming, IoT, AI. Once you've learned.NET, and you build one of these workloads, you can then build all of them with the same skills. It goes beyond that, we also have amazing tools. You can use Visual Studio family of tools to build dotted applications for.NET 6. If you want to use a cross-platform editor like VS Code, you can do that. If you want to drop down to the CLI and do everything from the terminal, you can do that,.NET is very flexible. We have an amazing ecosystem of thousands and thousands of packages out there that you can build your apps with. There's a ton of amazing projects in GitHub, and there's an amazing group of component vendors and staff that build tech on top of.NET. It's a huge ecosystem, completely unified in.NET 6. Now, let's talk about the momentum of our ecosystem. We have over 5.4 million developers using.NET every day and the Visual Studio family of tools. We have been the most loved framework in the Stack Overflow Developer Survey for three years in a row. The Cloud Data Foundation measures the highest velocity projects in GitHub, and you're going to see that.NET has been in the top 30 for many, many years. Now, even cooler, we have over 6.9 K community contributors outside of Microsoft, that have contributed over 21,000 contributions. That's an amazing effort considering that we only opened source.NET back in 2014. I want to step back and say thank you to all of those contributors for helping us drive.NET forward. Thank you to all of those contributors. Next,.NET and performance. One of the key tenants of.NET, once we reinvented it back in 2016, has been performance. The reason you should build your applications on.NET is they're going to be the fastest, they're going to run the lowest cost in the Cloud. You can see here, we are still doing really, really well in the TechEmpower benchmark, it's a public benchmark. You can see they were 10 times faster than Node.js, your app's going to run very, very fast. But I'm really excited about what we've done in.NET 6. If you look here, Entity Framework Core Performance, that's our ORM built into.NET for doing data access, and you can see it's 92 percent faster than it was in.NET 5. That's a huge leap in performance. On query performance, it's 36 percent faster. What's really cool if you take this TechEmpower benchmark and you take.NET, you take ASP.NET Core, and you take EF Core, put them all together, with the first full-stack ORM, we show up as number 2 in that benchmark. That it shows you, building a real application with a web, data, and.NET is going to save you. Now, let's talk about some of the cool features that we have in.NET 6. First off, I want to lead in, would say, go download it now, there's a URL right here, get.dot.net/6, and you can grab that to grab the newest bits. But as I mentioned before, we've got this unified common base libraries in SDKs to build all those app types, we have industry-leading performance, we have simplified development. If you look at development today with things like Python and Node, they make development studying easier. You're going to see a lot of demos today where we show you how we made.NET 6 the easiest to build new applications with. We've got great new releases of C-sharp and F-sharp, we've got support for Apple Silicon in one chip support. This is a long-term support release, so you can trust it, and trust.NET. But we didn't just ship a new version of.NET, yesterday we also released Visual Studio 2022. This is the version of Visual Studio designed to build.NET applications. If you want to go build a great client-side application using a web front-end with Blazor, it's got great support for that. If you want to build multi-platform applications using.NET Maui, it's got support for that. You're going to see some of the really cool features today as well. Hot Reload all app types, whatever you're building, whether it's a WinForm application, WPF application, a web application, we've got Hot Reload through all those apps, and even works on things like.NET Framework as well, so that feature persist all of.NET. This release also has great support for Git, whether you want to use Git inside of the IDE for your source control, or you want to actually right-click and have a GitHub Action file, so you can use CI/CD that's built in all the way from the core of the platform. It's got IntelliCode, it'll do full statement completions, it'll suggest after you to refactor your application. All of this in.NET, and all of this in Visual Studio, grab it today. Now, I'm really excited about this. We've been shipping these new.NETs since about 2016, that's the first version we shipped.NET Core 1.0. We know we have lots of customers out there on our older versions of our frameworks, so we've built a new tool called the.NET Upgrade Assistant, it's available today. You can see we've had 40,000 people tried in preview. What it will do is, it'll help you take an application, whether it's a ASP.NET MVC, web API, it can be a console application, a WinForms, WPF, class library, it helps you take all of those app types and move them to our new tech. It's a guided step-by-step experience. All those project types I just mentioned are supported. It's got support for C-Sharp, and we just added VB support as well, and it supports.NET 6. We actually built this tool internally as we would go out and talk to customers, one of them was Episerver, and we helped them port one of their large applications to the newer.NET. But I want to end with something else, if you are using.NET Framework, you should consider moving your tech to the newer tech because it's faster and has the newer features, but you should feel safe to stay there. You can stay on.NET Framework for as long as you want, it's going to be supported as long as Windows is shipping, but I'm excited to announce that we have an update coming for.NET Framework 4.8. It's going to be.NET Framework 4.8.1, and we're going to add ARM 64 support to it as well. You can keep your older applications on.NET Framework and have a path forward into the newer silicon that Windows supports. Now, with that, I want to talk about simplified development, and this is what I was highlighting little bit earlier. Newer languages get right to code, you don't have to have all the ceremony that we've actually had over the years in.NET. First off, when I think about simplified development, I think about Hot Reload. We all sit in a loop where we write some code, we run it in the IDE, we look at what the output is, we could decide to change the code, so we stop the application, we change some code, we recompile and start again. That cycle is super slow. What if you could just actually start running your application, go in and make a change, and push a button in the IDE, or save a file if you're in the command line, and the app would actually update and keep all of its states. This is going to make the inner loop, that's the action, as I said before, making some code changes, rerunning your application super, super fast. We're going to demo that. Less time restarting, more time coding, it's available in the CLI and in Visual Studio 2022, and it works on all project types, including.NET Framework 4.6, but of course it's going to work best with.NET 6. Next is C-Sharp 10. These are some of the most exciting features I think we've done in recent years, and you'll see demos all day of these features. One is global usings. If you build an ASP.NET Core application, almost every file is going to start off with this whole list of usings at the top. We're going to let you put those away somewhere else and reduce that code. Another thing is namespaces, if you're building lots of apps, your entire file is indented. Now we have a feature where you can actually put a semicolon after your namespace, remove all that indentation, less stuff in your code. You can also see as well, we added a feature called records in C-Sharp 9, and we now actually let you use that same feature, it lets you build a class in literally one line of code. Now, we actually let you do structs as well. Then, finally, this is my favorite, in many cases building Lambdas in the past, you would actually have to use a func of string or int or whatever, now, the compiler will try to interpret that for you and do that work for you, and mads is going to show that in a little bit. Finally, when it comes to simplification, if you built an ASP.NET, web API in the past, these are designed for enterprise level applications, so they can scale to whatever level, but that cause a lot of ceremony to be in the applications, you can see on the screen here, in literally three lines of code, I can write a simple API with.NET 6. These are going to make your life a lot easier, build faster, write less code, less ceremony, it's going to be great. I want to start off and switch to my machine here, and show a few more things about simplification. First off, if you've been using.NET for the last couple of years, even getting started as a new developer is a little confusing. If I run this, this is all the things that when you say.NET new, if you're on.NET 5 you would see. We've simplified that down in.NET 6. Look here, now all I've got, is I've got these basic types here. I can build a web app, a Blazor app, a class library, a console, WinForms, the BPF. If I had the Maui workloads installed, they would show up here as well, but this is just a getting started experience, is simpler. Let's go take a look at a.NET 5 application. If I build a console application in.NET 5, it's going to look something like this. Notice here I've got my using statement, which we mentioned before, I've got a namespace which indents my entire application, I've got the class, then a void static Main method right here, to do all that. Just to write hello world, I have to have all that stuff, and we've done a bunch of work to simplify that with.NET 6. I'm going to create a new project, let's do a console application. What's called Console App2, that's fine. I want to show something, this is super important. This is a new feature that we don't talk about a lot. If you're building an ASP.NET application, you can select which version of.NET you wanted to use. If you built a console application, a WinForm application, WPF application, or class library, you can not do that. You can see we've added into the File New experience, the ability to basically select the framework you want and we even show you which ones are long-term support, which ones are current. This is a much better experience for getting started. I'm going to click.NET 6. Let me bump this up. Now look at this, just the contrast from a.NET 5 application with all that ceremony, a.NET 6 application basically as Console.WriteLine Hello World, all in a single, just a single line of code, which is the way it should be. This is one of the cool features of simplification that we have in.NET 6. With that, I'm going to bring Maria up, and she's going to talk about the podcast app that we're going to build during the talk today. >> Thank you so much, Scott. During the course of this keynote, you're going to see us build a podcast application that highlights how we've improved our mobile desktop and Cloud-native backends in.NET 6 and what you can look forward to. I'm just going to smooth over to this particular laptop and show you minimal APIs. But before I jump into our podcast application, I'm going to show you how easy it is to get started with minimal APIs. I'm just going to do File New. I'm going to select a new project. I'm going to select empty web, hit next. WebApplication1 is a perfectly good name , and I'm going to create it. Now, in just four lines of code, you can build a functioning API. Never has it been easier in.NET to do this. It allows for people to build APIs the away they want to do. Allowing for you to build the APIs fast, quick, and get right to the code. Let's go ahead and show you how good these things work together. I'm going to click on here and show you how the minimal pattern has also transcended into our other templates as well. I'm going to create a new project by right-clicking on my solution, and I will find that. I'm going to add a new project. I'm going to select Web API, and you'll see that you have the option to build a Web API with or without controllers, which shows you how simply these two work perfectly together. With that being said, let me introduce you to the.NETPodcast API which has a backend of our application. When a go over to the.NETPodcast API, it knows a couple of things. All the things in dependency injections that you like, like Entity Framework and opiate API, they just work. I'm going to run this application, and there you have. You have open API, you have Swagger enabled. These are things that people within.NET framework love right now. I'm going to try it out. I'm going to execute it and I get a return of all the categories. But let's say I wanted to return all the episodes. This is another really cool feature that we introduced in the minimal APIs as well. An easy way to build your endpoints. I'm going to go back to my application. I'm going to go over here, and I'm going to add a MapGet. Now because I'm an incredibly slow typer, I'm just going to copy and paste it in. I actually copied and pasted it in earlier because I was looking forward to this. But you'll notice that because of improved lambdas, we're able to build these simple endpoints. With that being said, I'm going to introduce my dear friend Mads, who's going to talk about how the improvements in C Sharp have allowed us to support these minimal patents. >> Hey, Maria. >> Hey Mads, how are you doing? >> I'm doing great. How are you doing? >> I'm doing well. >> I'm always great when I look at minimal APIs. I think they're a great example of how we can do language design and API evolution together. One of the things you've shown here is the MapGets and MapPost here. They have some pretty significant lambda, some of them. You look at, let's see, let's do this MapGet up here for instance. That's actually a lot of stuff in a Lambda here. It used to be that, when you have a Lambda, you have to cast it somewhere that has to be like a delegate type that exactly matches it which hubbles API design. >> Yeah, it looked a bit complicated. >> Yeah. What we said in the language, you know what? The compiler should really figure this out. I'm sure lots of you developers out there have said the same thing, why can't the compiler figure it out for me? Now it can. What I'm going to do is, I'm going to take one of those Lambdas, I'm going to pull it into the pit and take the wheels off, and we can just look at what's going on now. Let's take this Lambda, move it up here, put a little semicolon. What you see first, let's hover on the MapGet. It just takes a delegate. We can put the Lambda here just to make this all compile. There's not like 100 overloads of MapGet, it just takes it any delegate. >> This is really the heart of the API experience that you get today. >> Yeah. But the problem is, delegates didn't use to be enough for the compiler to figure out what to do with a lambda. But now it can look at all this information, the types coming in, the type coming out and that affected it's async, and it can just figure out the right type for it. If you see the type that it's inferred in the bar here, it's complicated. It's a Func of several things. The return type is a task because this is async, the compiler figured it all out for you, you didn't have to do it. >> Wow, okay. >> You can just have one MapGet instead of having thousand or having the user code here cluttered with casts. That's a really important point I think. Now, let's put this back together and head up to the top of the file. Here's another thing. The usings. There aren't even actually that many usings here, and we'll get back to that. But typically, ASP.NET, there's a lot of name-spaces with a lot of good stuff and you tend to want to use a large set of them. That's on top of every file. Wouldn't it be great if you could just not have it on top of every file, I just put it in one place. Let me cut out these usings in quotes. Now we're going to get squiggles. But I have an ordinary C Sharp file here, it happened to be calling it global usings. >> Okay. >> It can be called anything. This could be anywhere in C Sharp code. I'm going to paste my usings here. That's not going to help because they're still only applying in this file, it's not doing anything with them. But now, in C Sharp 10, you can say global in front. Now they apply to the whole project, and so you just have one place where you keep track of all the usings that you need for this project and just to show you that it really works. You can see the squiggles have gone away. >> Round of applause online. >> Yeah, I'm sure. Please. One thing though is that you noticed and I mentioned that the list is fairly short. If you look at, for instance, web application here. It lives in is the very common namespace, Microsoft.AspNetCore.Builder. That wasn't actually on my list of things I hold out. How is it even building here? Why don't I go to squiggle? There must be something else going on. >> What's happening under the hood? >> What's happening here is implicit usings. That's where we figured you can have global using, but we can give you some as well. Based on the project type, there are going to be all these things that you're almost always going to want. Speed on that here, there's a list of, I don't know, 12, 17, whatever long list of things you'll always want, including the BCL stuff as well. >> Yes. >> Why don't we just build your global using and put it into the build, and they're implicitly there. You don't have to put them anywhere in your source code. >> Is it on by default or someone has to turn it on? >> In new project, it's on by default. You can go and turn it off if you don't like it. There's an enable here I can turn into a disable and save and then go back to program and let the compiler catch up. You see web application, now it lost its color. Now, it got it squiggle. It's gone. The fact that we said yes please, which I would always do now to implicit usings, I'm going to go and do that again, that essentially means that there's so much stuff you never have to worry about. Imagine coming to the library the first time. You don't even have to start worrying about what to include. >> What to include, but with implicit using, global usings, Lambda improvements, top-level statements, we've really embraced this minimal pattern, which is great for all types of developers from newbies to people building micro-services. >> Exactly. >> I love this. >> We did a few more things to get you simplify it. Here's one of the APIs that this app is using. It's very short because it's a record, but it's still annoying as Scott mentioned. Sometimes you have thousands of lines of class declarations and they are all indented because of this namespace that they have to live in. Why don't we just have a syntax for namespaces that applies to the rest of the file without these curies and this indentation? I can just say namespace; and all the rest is in there. Now, I can go and just have all my things nicely left-aligned. >> I love this and I feel like this is going to resonate so much with people coming to our platform the first time from other languages as well. >> I hope so. The one last thing is people really like records that's a super terse syntax that we're using here as well. It just fits right in that gives you all a value-based functionality, but it's always a class in C-Sharp. It's implicitly a class. Now in C-Sharp 10, you can make it explicitly a class. It doesn't change anything other than you get to say it. But of course, what's more important is that you can also make it a struck. Now we can build value types that have the same terse simplicity and minimalism as classes. We built that out fully again for this minimal experience. >> Absolutely amazing. Everything is available to people right now. They can download the.NET SDK, and they can try out everything that you'll be seeing throughout the day. With that being said, we'll bring Scott back on stage. >> Welcome back, Scott. >> Thanks, Maria and Nat. That was great. I think all of the customers out there are going to really love all the new C-sharp 10 features that allow you write less code for your applications. Let's next talk about Cloud development, which is a big thing these days, and.NET is a great platform for building Cloud style applications. People always ask me, Scott, can you give me some examples of some of the teams inside of Microsoft that are building their applications or their services on top of.NET? We're going to talk about a few of these today. First off, you can see here Azure Active Directory gateway is running on.NET. The App Service gateway is running on.NET. I'll talk about both of those in a second. Bing.com if you go to Bing and Bing something, that's running on.NET. If you're hitting a Dynamics 365 web application, well, the gateway in front of that is running on.NET. You can see that Azure, Bing, Dynamics are all running on.NET. There's lots more as well, but these are a few that we're going to talk about today. Now, a second ago I said the word gateway a few times. A gateway is a reverse proxy sitting in front of an application. Azure App services is an example of a place where this happens and so is Dynamics. We were talking to teams around Microsoft and they needed a modern reverse proxy and we thought that would be a great example of something to try to build on top of.NET 6 as a way to make sure that we're continuing to push and drive performance. You can see here on the slide Dynamics, which is running behind YARP, which is now available in 1.0 available to you today. You can see 100 billion requests a month, 7.5 petabytes of data going through this gateway, and it shows you how.NET can scale. You've got your Cloud scale performance, highly extensible and customizable. It runs on a variety of our.NETs and it's open-source and used by us around some of our biggest services, so I'm super excited about this project. The next thing I think about when I think of Cloud is, what are some of the common patterns that developers building Cloud applications use? One of those is going to be an N-tier scale web application. That's where we've got a frontend with a backend and some database on the backend, and.NET is great for building these applications. It was designed for this stuff. The second type of application is the microservice type style application. This is what's more modern. You hear words like containers and Kubernetes, but the real point of this is breaking your application into more pieces, and each of those pieces can scale up and scale down independently of each other. It also gives your teams a better way of working because they can version each of those components separately. The cool thing about this is.NET is great for building all these types of applications. One of the core tenets of our team has been focusing on the N-tier and the microservice style applications and we'll do a demo of some of that in just a second. If you build those types of applications, Azure is a great place to host them. I'm happy to announce today that.NET 6 is available in Azure App Service in all regions, both on Windows and Linux. It's available in Azure Static Web Applications as well, with Blazor WebAssembly, with AOT support, and it's available in Azure Functions both in-process and isolated models. If you want to take your.NET 6 applications, host them in the Cloud, we're ready for you right now. Now there's a new thing we announced just last week called Azure Container Apps. As you start thinking about building these microservice applications, we want to make sure that both Azure and.NET is completely ready for you. The big thing here is I mentioned a lot of terms earlier, Dapr files, Kubernetes, Helm charts, all these things. I'm an app developer. I want to focus on my app, not the infrastructure and Azure Container Apps enables me to do just that. It's actually running on Kubernetes, but I don't have to think about Kubernetes and all that stuff. I can just think about my containers, publish them up, and they just work. Now you might ask, what does it do for me? It does a lot of things for you, it provides scale. You're going to see a demo of that in a second. It provides the ability for each of these apps to see each other. In a microservice world, each app has to be able to talk to each other. It enables that because they're running all in the same cluster, it enables you to actually see, roll forward and roll back your applications. That's going to be Azure Container Apps. It's a great way of building.NET applications for Azure. I'm also excited to announce that with Visual Studio 17.1 that's the preview of the next minor version of Visual Studio, we've already got support for building worker service applications. Right from Visual Studio, you can publish right to Azure Container Apps. In the next preview version, we're going to add all of the web types. You can build an ASP.NET minimal weight API and easily publish it right from Visual Studio. Now with that, I'm going to bring up David and Scott, and they're going to talk about how they can build these microservice-style applications with.NET. >> Thanks, Scott one. >> Hello, Scott two. >> Hello. >> Nice shirt. That's pretty good. >> It's pretty good shirt. This is actually a shirt the team made, actually it has the commits and on the back there is actually a button [inaudible] about the product. >> Very cool. I like that shirt. >> Yeah. >> I want to trade. >> Not for sale. >> Not for sale. All right. Let's context setting. We saw Maria and Mads wanted to go and they were making a minimal backend web API because we're building a podcasting application. >> A podcast, that's right. >> What's our role in this podcasting app? >> How do we get podcasts in the first place? We need to figure out how to get podcasts in the system to actually expose it to our clients. >> Podcasts are usually RSS feeds. The naive thing to do would be to have a client app talk directly to your podcasts and get your RSS feed. >> Every single time. >> Well, that scale. >> It's expensive. I can't do that. Instead we want to have the frontend API, have an ingestion point where I can send an RSS feed and it will put it into a background create cube because they want to process that feed to do a whole bunch of things, compute intensive things. >> The RSS feed gets sent in and put on a queue and we don't know whether it's going to be one a minute or 10,000 minute. We strike it on Hacker News, it could be a thing. >> Could be a Buzz. Yeah, exactly. >> We need to scale a little startup here. >> That's right. >> All right. >> We have two applications, the pockets API for the backend and a background worker and a queue in between them. >> Background workers have historically been complicated because an ASP.Net app is usually good for a request came in and a response comes back. There's a long running background thing. >> That's right. >> Then you just said it has to scale too? >> That's right. >> Okay. That's hard sometimes. >> It's hard. But luckily we have a first-class thing called a worker service in.Net for these background workers, specifically. >> Let's see it. >> All right. Let's jump to the code now. Let's go into the project. This is the back-end API that Maria and Matt showed. Should we zoom little bit? >> Okay. >> The QueueClient right here is the address toward SDK QueueClient. I'm adding it to the dependency injection container. I'm grabbing the connection string from configuration called phi-Q. >> Okay. >> Then we're going to scroll down, all the way down to a minimal endpoint. It's very succinct right here. The v1 feeds endpoint is going to inject the QueueClient via dependency injection in the argument. It's very nice. Then we get the RSS feed injected from the client, the client sending a post to our endpoint. I'm going to create the queue if it doesn't exist. Then we're going to put a binary serialized payload into the queue. We've got our important from the actual client. We're going to put into the queue and we're off to the races. >> You've posted that to that endpoint and then you have to ingest it, put it into the queue, and then some workers will pick it up later? >> That's right. >> All right. >> Let's jump to the worker service. This is a brand new.NET six worker service, which is using minimal API style code. There's global usings top-level statements. Now we have, instead of 20 lines of code, I think, let's say 40 lines of code, not 24. That's our code. >> Twenty-four. I'm noticing you said, this line 1, there's no line 0. >> Exactly. >> We saw what Mads and Maria showed that the usings are implicit. We got to outdent instead of indent. >> But still work having my code push up against the left. >> It's too far left. >> It's nice. I'm configuring Office to our Local DB, which is SQL Server. >> Yeah. >> Our QueueClient is being configured the same way it was configured in the web API. Then we're going just to add some code to handle incoming feeds off the queue. We're going to jump into the worker service. >> We've got this ad hosted service worker. >> Yeah, this thing runs forever in the background, doesn't have any traffic. >> Okay. This is the actual worker right here? >> Yeah. >> It's an internal class and it's derived from background services. >> That's right. >> It runs for a long time. >> All right. >> We grab the QueueClient, the same one that we got in the rest API. We're dequeuing a message from that. >> Yes. >> It's going to have a single feed item. >> The feed item comes in and it goes into a queue and then I'm just one background server and I pick it up again and look at it and do some stuff. >> Yeah. >> Okay. Then we do some dependency that doesn't match, it will skip over. >> Yeah. >> Then to the important part, we grab the body of the message. >> Yeah. >> Scroll to the right. It's a little bit. We convert that thing from JSON, because we added JSON payload to the actual queue, and now we're going to grab it as a record, and we can actually deconstruct it. It's pretty cool feature of records. >> What's that? What are those? >> See you've got the record and we actually pulled out to the properties without having to do anything else. This is the C-Sharp feature, I believe. >> Nice. That's an unnamed object itself record out there, just like Mads talked about. >> Yeah. >> Very cool. All right. So that picks it up? >> Yeah, and then we ingest into the queue. >> All right, but Hanna was talking about Cloud Native and containers and scale. You just showed me how one worker can pick this thing up and do a thing. >> That's right. >> What I want to do it n times? >> If you wanted to, typically, what you would do is you would scale out your workers on-demand based on the load of the queue, the queue size. >> Okay. >> If I get Hacker News, if I get spammed for some reason. >> You could be Hanselman. >> You could be Hanselman. You got a big ingestion of queues and then you would get more worker services to hire the load. >> All right. Well, we've heard about containers. How do I get this into a container then? >> All right. First, we have to containerize the application by adding Docker support, this is a keynote, this has been done beforehand. >> Yeah. >> But we can do it really easily. Just right-click at "Docker Support." Cool. >> Now we have it for our podcast API and for our worker. There's two Docker files there. >> Yeah. >> All right. Now with magic demo gods, I'm going to show you the live service running in Azure. I'm going to escape that part. >> We login to the Azure portal on the portal, hit "Refresh" as it logged us out because we've been hanging out. >> All right. >> It's okay. We took too long before we were waiting. Will log you back in. >> It's running in Azure. We promise. >> There you go. >> There's [inaudible] application. >> We've got a resource group. >> It's running as an Azure Container because you actually have a microservice. >> Cool. >> Here's the environments, scroll down a little bit. >> Scrolls. >> We should see classifications, the API, and the podcasts worker and is warmer but I won't talk about. >> We got the podcasts, we've got the ingestion. Cool. >> Yeah. >> It's up there in a container right now. >> Now we want to show you web-scale. Here is- >> Web-scale. >> Web-scale. I have a script that will simulate a ton of the users here in my backend API. Right now there's nothing running through the background queue. >> Okay. No replicas. >> I'm not paying for any compute now. >> Cool. >> Yeah. >> We're not famous yet? >> It's free. >> It cost us nothing. >> It's free. >> Let's do it. >> Now we going to hit "Enter." >> So you're simulating traffic right here? >> Yeah. >> You grabbing, hopefully in my podcasts. >> I got Hacker News and now it's going to scale up. >> [inaudible] I guess. >> I hope it's going to scale up. It's going to go from zero. >> You just did a bunch of requests and we've got a replica here. Then how do we know when it succeeds? >> It's going to hit one at some point. >> Okay. Takes a couple of 10-20 seconds. >> It's sync itself. >> It's probably already happened. >> It's possible. >> Which one of these? This one here? >> Yeah. It probably will show up. >> Okay. Do we have to run this multiple times? >> Let me show you one thing. >> All right. >> Let me try. >> If we figure out something, oh, you're going to run the while statement again? >> Yeah. >> What? >> You see a movie three by three. >> You were hoping that that would automatically update but that little sleeper probably fell asleep. >> Yeah. Fell asleep. >> Cool. That means that it now went from zero, no money to three, and then when it's done, it will show back down there one or two. >> That's right, after the whole keynote. >> After the keynote. >> It will be zero. >> Very cool. All right. >> This will web scale. >> Yeah. >> Microservices. >> Container apps. >> .Net container app Docker. >> Long-running background services. >> Yeah. >> Then, now our client team is all set up for success. >> Yeah. >> Very cool. All right, let's bring it back to Scott. >> Thanks, David and Scott. Let's talk about client developments. We shipped Blazor a couple of years ago, and Blazor is a great way of building full-stack web applications with.NET. Blazor lets you build a modern client-side application just using C-Sharp, you don't have to write any JavaScript at all. We have two models of building Blazor applications, you have a Blazor Server application, which is when you have the full power of.NET. Because the app is actually running on a server, and as I make changes to the application, a request is sent down to the server, it sends the state back and we redraw just the parts of the screen that need to be updated. It's an amazing tech because it gives you a super lightweight spa-style application, hundreds of bytes versus megs. But there's also another flavor of Blazor called Blazor WebAssembly. In Blazor WebAssembly, we use the power of WebAssembly to run your entire Blazor application directly in the browser. Now, this is cool because an application like this doesn't even require the Cloud. You could actually run a full app like a game or something that runs totally in the browser with no connection to the backend. We offer you these amazing choices of building whatever frontend app you want to build with.NET. It gets a lot better with.NET 6. Those Blazor WebAssembly applications, we actually interpreted them and using a wasm interpreter in.NET 5. With.Net 6, you can compile your entire application before we call it ahead of time compile, which means the app will run much faster and it more native speeds in the browser. Another thing is, I mentioned before one of the benefits of Blazor Server is small footprints of metadata goes to the browser. We've done a lot of work in.NET 6 to reduce the size of a Blazor WebAssembly app as well. Dan's going to show that in a little bit. Those are just a few of the things I'm going to let Dan really do a deep dive into all the cool stuff that's coming in Blazor and.NET 6 in just a second. But I'm also excited about Blazor Fluent UI Components. About a year ago we started working on Microsoft Teams. There's a mechanism that you can build apps that can be hosted inside of Microsoft Teams. If you're a.NET developer, you can build a Teams application using Blazor. We had to make sure that those Teams applications looked appropriate inside of the Teams client. Teams is built using something called Fluent UI. It's some UI standards built by Microsoft, and what we've done, you can see here we've got 40 plus Blazor components that wrap Fluent UI, which allows you to build applications that look amazing and look like modern Microsoft applications using Blazor and.NET. You can see your integration with web Windows, Teams, Office, and more. I think maybe they're going to show a little bit of this. I know they're going to show a dark and a light theme thing in a second. But super excited about these new components for Blazor, so you've got all the Blazor six features, Blazor Fluent UI Components. Then, of course, you just can't talk about client with Blazor, we also have to talk about.NET MAUI or.Net Multi-platform App UI. This is one of the exciting features to me in.NET 6. It's going to ship early next year. What this is it's an evolution of Xamarin. Xamarin was a library or a product for building iOS and Android applications on.NET. But we thought let's take that to the next level. Let's actually let you build apps that run on Windows, Mac, iOS, and Android. One single codebase can target all of those platforms. We also took the Xamarin and enhanced it again as well. With Xamarin, you had a project for each of these different platforms. Now, we have a single unified project, one project can support all of those app types. You can right-click in the IDE and deploy to the various targets you want to do it, and I said it's going to be available next year. Another cool part about MAUI is it's not really a UI stack. If you look here, notice on Windows, it shows WinUI, on Mac, it shows Mac Catalyst, iOS and Android. What MAUI actually is doing is abstracting each of those platforms and using the actual real underlying technology, so your Windows app, if you build a Windows MAUI app, it looks like Windows. If you build a Mac app, it looks like Mac, and that's one of the cool aspects of this technology. I'm super excited about it, it's going to ship early next year. Then we thought, let's take it to the next extreme. I'm a web developer, but just because I'm a web developer, I still might want to have access to a desktop or a device. We're going to let you take Blazor and.Net MAUI and merge them together into a single unified stack. I can build a MAUI application, I can reference a Blazor project, and that lets me build a desktop application using web, which means I can share all my web components across all these different platforms. Whether you're a web developer or you're a native application developer, you get the best of both worlds in.NET between MAUI and then Blazor and.NET MAUI. With that, I want to move and talk to a couple of customers that we have running on.NET. This is Powered4.tv. It's a start-up media company based in the UK serving 65 countries worldwide. They provide independent on-demand wrestling content to their viewers, they use Blazor WebAssembly for their frontend and ASP.Net Core on Azure and are very happy with the productivity performance and scale. In fact, they've been using.NET 6 release candidates for the live site for a while. Check out Steve's talk later in the conference. Also, I want to talk about Pronto Pay. Pronto Pay is another startup based in Houston, Texas, that chose to go into production with.NET MAUI because they needed to move fast. They love the simplicity of a single codebase that they can build to target multiple devices and the productivity of Visual Studio. Then GE Digital Aviation, they are a group that developed FlightPulse an app that puts data and analytics in the hands of more than 3,000 quantize pilots to help them improve safety and efficiency on every flight. The Config Console is built with Blazor and they were able to work faster, share more code, and it was a lot more seamless development experience than they had previously had with Angular. With that, let's roll a video. [MUSIC] >> Flying an airplane is no small feat. Commercial pilots must make hundreds of decisions to get passengers to their destination safely. But what if we could give pilots the tools to make better decisions? To understand how their actions affect critical areas like safety, fuel efficiency, and sustainability. [MUSIC] GE Digital created the FlightPulse app to meet this challenge. Connecting millions of data points from on-board sensors to give pilots true insight. Built on Microsoft Azure and using Blazor, a framework for developing web UI with C# and.NET. FlightPulse provides crucial flight data to the people who need it most. GE developers built the backend APIs for FlightPulse with ASP.NET core. They chose Blazor, a feature of ASP.NET core for the UI. Because Blazor uses C# for both client and server code, developers could easily share code and logic between the front and backend. Backed by Blazor and other Microsoft technology, GE was able to work faster and more efficiently bringing flight pulse to life in months instead of years. Now pilots can review their post flight data and make important adjustments. In fact, pilots have increased their performance of fuel efficiency techniques by up to 15 percent, reducing carbon emissions. Putting useful data into pilot's hands, benefits everyone. Together, GE Digital and Microsoft are making the skies a better place to be. >> I'm excited to also mention that.NET MAUI Preview 10 is available today. You just have to grab the preview builds of Visual Studio 17.1. If you didn't know this, you can actually install Preview Build side-by-side with the RTM build. They don't mess with each other at all. It's actually safer, I've been doing it for years at this point, and so if you want to try that in MAUI, grab the Preview Build, it will not interfere with your RTM build. The Preview 10, has a few things, Windows app SDK, fully integrated, more controls, performance improvements for Android, and a lot of layout improvements and bug fixes. As I said before, this is going to ship early next year. Now that we've talked about some of the client technologies, I'm going to bring up Dan, to talk about Blazor. >> All right. Thank you, Scott. Hello, everyone. Well, we just saw how we can build a simple and scalable backend for our.NET Podcast app. Now let's use ASP.NET core and Blazor to build a beautiful modern web UI for our.NET Podcast app. I've got the front end application here, let's go ahead and get this running. Go ahead and build and get going, there it is. We have this beautiful landing page for the application. It's got a nice modern responsive UI, looks great on big screens and small screens. This page was actually built using ASP.NET core Razor Pages. It's being dynamically generated on the server. But if we sign into the Podcast app, now the Podcast app part, this was built using Blazor WebAssembly. It's running client-side in my browser on a WebAssembly based.NET runtime. This is full stack web development with.NET. We've got a bunch of features already implemented, we can check out one of these podcasts, let's check out the.NET MAUI Podcast. We can select an episode, let's go ahead and play that. [MUSIC] >> Yeah, I got in-browser playback, got nice, jazzy theme song, I would definitely going to want to listen to that later. Let's go ahead and mark it actually to listen later using this little icon that will make that episode show up in my listen later lists, so I can remember to listen to all those podcasts that I want to listen to. We can also go back to the Discover page and you saw these little plus icons on each of the podcasts. We can select podcasts that we want to subscribe to. What's subscribe to.NET MAUI, maybe this one. Now I'll get notified when there are new episodes for these podcasts. I want those to show up here on this subscriptions page, but nothing is showing up there yet because it's not implemented. Let's take care of that now. I'm going to snap the browser over here to the side with Visual Studio. Let's give ourselves a little bit more room to see the code. Here's the actual subscriptionspage.razor file, and you can see I've left myself a little to do here to actually add some code. We're already loading all of the subscriptions into this show subscriptions variable. Let's render them. I'm going to delete that and let's add, I don't know, let's add an unordered list, and then let's do a four each over each item in the show subscriptions. There they are, great. Then inside here, let's render list items for each one. There we go, and after we got that, we'll go ahead and, I don't know, let's just render the title of the podcasts just so we get something on the screen. Item.Title. Okay, great. That should be good. We're looking all right here. Yeah. Now, let's go ahead and click the Hot Reload button to apply that to our running application. Boom, it just shows up. Almost instantaneously. Hot Reload will apply my code changes to the running app while it's running without having to rebuild and restart. You preserve all your App State, you can be productive, and code, and build your UI quickly. Let's add some more stuff in here. Let's go and let's show the author, I don't know, we'll just throw in an H3 header in here. Item. I need an at sign, so it's actually an item, author. This time instead of using the Hot Reload button, I've already set up this setting right here where we can Hot Reload on File Save. I'm going to hit the Save button this time. Looks like I have a bug in my code. What did I do? That little turn at the end there. Let's save that right here, and boom, Hot Reloads into the application. Great. We're going to need some images, so let's do image, source, equals and I think on each item there is an image property that we can use to get the image URL. Let's close that off, save one more time, and we're seeing our images on the screen. Great. That's Hot Reload. Now, obviously, we've got some styling issues here. We need to fix that. I've already got a show card component that's part of this application that I'm going to use to render each show. Let's remove all the stuff that we hand typed before and let's just put in this custom made component. What is this doing? Well, let's go to definition to see what it does? In this show card component, we have a card and it has an action menu, and inside the action menu, that's where we're actually going to render the little plus sign so we can subscribe to each show. Then if we look at the definition for the card, that's pretty simple, that's just divs and rendering the picture and so forth. Let's go ahead and Hot Reload that, we'll save. Now we're getting somewhere, so we've got full width images, we got styling for our title and author, we can see the little action on each show. Now, if we unsubscribe it then disappears from the subscription page. We can add another one back if we want to, and that should then show up on our subscriptions page. That's good. It's not quite what I want yet though, I really would like these podcasts to look like the ones on the Discover page. This grid like layout. Let's see how that's done on the Discover page. Well, it's got this grid component that it's using to lay out each of the podcast. Let's just copy that, we'll just reuse that. We can get rid of our unordered list and just put in the grid, a little formatting here. Then I think we going to change the code up here. Let's remove this group, that value, and put in our show subscriptions. We're iterating over that, and I don't even think we need this T item here because that should be inferred. Now when I save this, well, Visual Studio now is telling me that this actually was a change that can't be Hot Reloaded. Involving, a little too much stuff, and that can happen. Some changes are not supported with Hot Reload. We are working on expanding the set of changes that are. But when it does, Visual Studio will prompt you and let you know, hey, you need to rebuild this application, which is this first option, or you can go back to editing if you want to fix things up, and there's even this option up here, this checkbox, so you can say, you know what, I always want to rebuild whenever this happens, so just go ahead and do that for me. I'm going to go ahead and go back to the subscriptions page, rebuild and apply the changes. Hopefully if I did everything right, then we should now see our subscriptions nicely laid out in a grid, just like they are on the Discover page. It's rebuilding and it refreshes the browser for me automatically. Beautiful. That looks exactly like how I want it to. One last thing I want to fix, if I remove all my subscriptions, I'm just going to uncheck these, they disappear. Now I'm left with this blank screen. That's not very nice. Let's add a little bit of UI when we have no subscriptions. Add another little snippet right here that I'm just going to copy and paste, to save on some typing, and go back to the app. In this Empty results for this grid, we're going to add that little bit of content. Then we'll save that into Hot Reload one more time. Boom, we've got our nice little UI placeholder. We can go back, discover podcasts, subscribe to a couple, and now they show up on our Subscriptions page. Awesome. That's Hot Reload. You can get productive fast. Looks like this app is ready to publish. Let's go ahead and publish the application. I'm going to go to the Solution Explorer, right-click on "Podcasts server", the server project, and we're going to publish this application. When we do that, this is a Blazor WebAssembly app, we want to use all of the new optimizations in.NET 6 to make this app nice and small and load fast. In earlier versions of.NET, we could trim the.NET code to remove any code that you weren't using. We would pre-compress the files to make them as small as possible using Brotli compression. But the.NET runtime itself, which was implemented in WebAssembly, was kind of a fixed quantity. Let me show you what I mean. Like in this app, even in development, we can see this, If I F12 to see the browser dev tools, make this a little bit bigger. Let's just clear out the site data so we can see all the files get downloaded. There's lots of stuff that'll be downloaded during development because it's unoptimized. But if we look at the dotnet.wasm file, the runtime, that guy is a little big. For a runtime, it's pretty impressive that it's only a megabyte. This is only gzip compressed. If you Brotli compressed it, it does get smaller like 7800 kilobytes. But can we do better? The answer is yes. In.NET 6, we can. We have this new.NET WebAssembly build tools that you can install with Visual Studio or with a.NET SDK. These build tools do a number of things, they allow us to ahead of time compile our application for much better runtime performance. We can link in native dependencies into our Blazor WebAssembly app. In this case, what we're going to do, is we're actually going to re-link the runtime to remove stuff that we don't even need. I've got the tools installed, so all I have to do is publish. If I go back to the app, let's actually do that publish now, right click "Publish". I've already actually done this before. It does take a little while to run all those optimizations, but we can go ahead to the Published output and let's run the server. There it is. When I've done this in the past, typically I hate this caching issues, so we're just going to fix this real quick. This is from the previous demo. We're using the same port as an earlier demo. I'm just going to right-click "Empty cache" and now refresh. Now when we go to the root of the app, hopefully, yes, we can see the application. If we go to the podcast app, and leave the browser dev tools up because we want to see that dotnet.wasm, there it is. If we look at its size now, only 350 kilobytes. Dramatic size reduction. Our app loads much faster. We can do even better with.NET 6, by prerendering this app from the server. We can take those same Blazor components and render them server-side so that we get HTML and pixels on the screen almost immediately. With.NET 6, we can actually take any state that you used while prerendering, like you go, went and fetched all the podcasts, and we can persist that, into the page so that it can be reused on the client. Notice if I refresh this app, refresh, refresh, I can just keep refreshing, it loads almost instantly. There is no loading spinner, there is no loading... That's because it's being pre-rendered. If we look at the source for the page, the HTML that we got from the server. Here's all these devs, these are all the podcasts. They're already rendered into the page. At the very bottom there's this Blazor component state. That's the podcast data that we got from the server that we can then reuse on the client. That state preservation during prerendering, new in.NET 6. Last thing. This thing of course is got to be a progressive web app. You can see that Edge is recognizing that it's a progressive web app. It's got a web service worker and a web manifest. We can install this on our Windows machine and now we've got a nice native shell. Looks great. We can listen to podcasts. This is now a stunning web application built with.NET 6. But if we really want to deliver an elevated experience to our podcast users, we're actually going to want to have native client apps for mobile and desktop that can take full advantage of the capabilities of those devices. Do things that you might not even be able to do on the web. For that, we're going to need.NET MAUI. That's what Maddy, I think, is going to show us now. Come on out, Maddy. >> Thanks, Dan. Let me switch over my desktop. Great..NET MAUI is the best way to develop apps with.NET, and C#, and XAML for Windows, Android, iOS and Mac catalyst. Your desktop platforms, your mobile platforms, all of the things you could possibly want. Right here I actually have the same app design that you just saw from Dan. But instead of being built with Razor, it is built with C# and.NET. Let's take a look at the Solution Explorer, when I come find my mouse. You can see it's kind of the MVVM you know and love if you've built a desktop or a mobile app with.NET before. We've got our views and our view models, we've got some other stuff in here for Blazor, and we'll look at that later. I just have some pages right here and all the things I could possibly need it to build a beautiful app with XAML, and.NET, and C#..NET MAUI, like Scott mentioned, is really built on this foundation of being really simple. We have one project for you where all of your code lives and that's right here, that's this Microsoft Net Conf 2021 MAUI project. It's got one project file, where I have all the target frameworks listed using multi-targeting with.NET 6. I can also set all of the attributes of my application in this one place. It's just called.NET Pods. I have my app ID, my version, version 1, because this is the first release of this app. Some target framework stuff for the supported operating systems for the platforms I'm on. Then this is probably my favorite part of.NET MAUI, all of our shared images are declared right here. We see that we're just including the wildcard folders for these images and fonts, which in my Solution Explorer are right scroll, resources, here. I have some fonts, some images, I have shared strings, I have shared styles. Then I have these SVGs here as well that are called App icon and splash. With.NET MAUI you can use SVG files right off the bat. That means they're going to scale perfectly for you no matter what device or resolution you are targeting and you don't have to mess around with all different types of PNGs and sizes. But something that we do that's really cool is we dynamically create for you app icons and splash screens based on the files you give us in the attributes you set in your project file. This is just a Maui image and you can see as my resource is the app icon right here. I have a foreground file. This app icon back here is actually just a background color. Then I have my foreground file, which is the foreground, so that's little logo of the podcasts app. Then I just have is app icon true? That's it. That tells the app that when it builds this and bundles it and makes the package native for the device or the a platform that it's running on, to use that as the app icon. Same thing with the splash screen. The splash screen or the loading screen or the launch screen, whatever you want to call it, we just have an SVG we give it in a background color, and that pops right up when we load up the app. I have it running here already on Windows. You can see it's the same app, but like I said, it is in XAML and C# so there's a little bit different styling because my app isn't quite as pretty as Dan's, but he worked really hard on it, so it's fine. It's the same thing. I can click around, I can see everything, I can subscribe. This beautiful subscription functionality is wonderful. But I have all of the tooling that you'd get for Windows apps and this is using Winamp SDK so it's WinUI 3, this app. I get all of that tooling inside of Visual Studio 2022, which shipped yesterday. I am in Visual Studio 2022, Preview 1. The Preview release, which also shipped yesterday, which is where you're going to get all of the Maui development tools and the Maui workload installed right for you, from the installation. Like Scott said, great to run them side-by-side. Let's go into a XAML page here, we go into the Discover page. We've got a lot of code here. One of my favorite things to show off the beautiful XAML Hot Reload is to first, pop it into XAML live preview. This is actually the same app. It's this app. It's taking a second to load. That's okay, we can restart it if we need to. Let's do that. I played around with it too much. That's okay. A lot of rebuilt. Then we're going to look at live preview, which you might have seen from some of the demos yesterday. Live preview is the ability to actually mirror the app that's running in Visual Studio. Instead of having to click in between it being up and top of my screen right now like it is, or move it to the side or move it my second monitor, I can just pop open live preview and I see it right here. I can add my ruler and my grids and all the great things. On my collection view here, let me pin that, on my collection view, which is this collection of all the different podcasts we have here. I'm just going to add a background color. I'm going to make it hot pink because it's going to be very obvious when I make this beautiful hot pink background change. I'll zoom this in a little bit. I can see that I can add my grid lines. It's just the app that's running right here in Visual Studio. I can also go ahead and inspect different parts of my UI. Let's pull up this live visual tree here and expand this app. I can see that this is a Shell App, we're using Shell to describe our navigation. It's just four tabs, discover, subscriptions, listen later, and settings. I could open it up and click around. I can see this collection view. I can go to where that's defined in the code. I can really easily navigate all my XAML even on this super-constrained screen right now because I'm zoomed way in so you can see it and find all the different things I need so I can make the edits I need really quickly. Let me get rid of that hot pink control Z. There we go. Don't want that. Let's take a look at this at the second platform I want to show you, which is Android. I have a platforms folder in this project, and it has some of the native code I need to tell an app how to start on all the different platforms, so we have Android, iOS, Mac Catalyst, and Windows. Because this app is multi-targeted, I can go into my regular debug and deployment dropped down my platform selector, wherever you want to call it. I can change my framework right here to.NET6 Android. It pops up with this long titled thing, which is a beautiful new feature of Windows 11 called the Windows Subsystem for Android. I'm going to start building this. Give it a second. I'm going to tell you how I did this, which is by using the Android Debug Bridge, the ADB, which is part of the Android Development Kit that's installed with Molly in Visual Studio. You don't have to do anything special to get that. I opened up the Windows Subsystem for Android. I connected to the port, and now my computer believes that this is a physical Android device plugged into my machine, but it's just showing up right here on my screen. This is the same app, the same code I just had on Windows, but now it's running on Android. I can prove this to you by doing another hot reload here. Background color is hot pink and there we go. Nice and ruining this beautiful app with my background colors. The Windows Subsystem for Android it uses the Amazon App Store. If you need to use the Google Play APIs, this might not be the right solution for you to test that specific functionality. But you can use this just like an emulator, except it's as you saw, a lot faster than what you might expect with an emulator. Or you can use a physical device. There's all different ways to debug and target Android. You can do what's best for you depending on the needs of your app. Since this app is not using any Google Play APIs, I have no problem using the Windows Subsystem for Android here and it's awesome and works great. I still have my live visual tree here so I can click around. That's 1/2 of the MAUI story. We're going to flip over to the Mac. You can tell that this is my Mac because it has all my stickers on it. Up here I have the same app, again, the same XAML, same C# running on an iPhone simulator. It's in dark mode because dark mode is the best I can flip it on and off, beautiful. I could do all the code editing I want to do here. This is Visual Studio for Mac Preview, which released yesterday as well. We are currently working on.NET MAUI support in Visual Studio for Mac. You're not going to have as full and robust of an experience as you have in the Windows preview yet. We're looking at releasing that in preview early next year for Mac and then shipping it with.NET MAUI when we do ship general availability. But it's still a great text editor. It's been rebuilt from the ground up. They're moving it to.NET 6. VS Mac is going to be built on.NET 6 in just a couple of releases. It is going to have native Mac M1 support for the new processor. It's already super-fast, but it's going to get even faster, which is very exciting. Yes, so I have it on the iOS simulator here and I can interact with it and all the things. It's beautiful little layout stuff that I can go tweak if I want to because this is now rendering using the iOS controls for the native iOS platform. Then there's one more I want to show you. Let's pull this up and I think I have it running and I do. Finally on my Mac. This is running natively on my MacBook using what's called Mac Catalyst, which is Mac's and Apple's cross-platform technology to run the same app for a MacBook, for an iPadOS for on an iPad, and for an iPhone. We can actually deploy this version of the app onto all those devices, which is really exciting, but it's the same thing. Of course, I have my dark mode. Got a habit, it's great. Turn that off. This is all, again the same code. I know it sounds like I repeated myself, but I am just so excited that we can have this one project. The same pages, the same MVVM and C# and XAML and all the things running in all the places using the amazing tooling that we have with Visual Studio and Visual Studio for Mac, for iOS, Android, Mac, and Windows using.NET MAUI. >> Maddy, hold on. >> Oh, no. >> Before you wrap up, I can tell you're about to finish. I have something to show you. We just added something to the Blazor web application. >> Okay. >> It's super cool. Let me show it to you. Let me bring up a browser here. I'm going to go into the site that we've deployed to Azure. When you sign in now. There was this listen-together tab. You may have noticed that before it's now working. Yeah, go to the site on your Mac. If I click "Pick an Episode" like, let's just pick this one. There's this icon over here called listened together. I can select an episode and then let me type in my name and this will create a room. Then you should be able to join my room. >> I see it. >> This is using signal r. It's a real-time experience. Now we can listen to this podcast together. Let's go ahead and get to go in. [MUSIC] >> Yeah. >> Okay. >> Even better you can react. I see you're sending me some hearts. I'm going to send you some thumbs up. I think this is a really great experience for listening to podcasts with your friends. >> Yeah. >> Can we get this in the MAUI version of the app on mobile and desktop, it's just a Blazor component. >> Dan, I'm lime 10 steps ahead of you. Don't worry. Let's take a look at what I've done here. I brought in that same component you're using in that Blazor App. I brought it into my MAUI project here. I just linked, it is just a library, Podcasts Components, and I referenced it in this page we have, which I had app the Listen Together page. That's just a Blazor Web view. >> A Blazor, it is like a little browser control in your MAUI App. >> In my MAUI App. My Listen Together component, I reference right here this is an component type. Then in my Shell, which is again how I describe the hierarchy of the navigation of my app. I just added a Listen Together tab. >> Does it work? >> I go here. Let's see, it's loading with Blazor, that's your room. >> Can you join my room? >> I'll join as Maddy 2. >> You can never have enough Maddy's, you can never have enough. Let's see. >> Then I'll clap. >> Yeah, we're listening to the podcast, oh, my goodness. >> It works. >> Lots of applause. >> This player here, this is cool, is native to the Mac. That's actually built with the code necessary for Mac to have the best player experience. That's a Web Player. On there it was the Android player. Now it's all back. I don't want to put the crying emoji because I'm so happy this demo worked. >> Native.NET MAUI App with native UI controls with Blazor Web UI altogether, cross-platform, desktop and mobile and web. That's pretty amazing. Thank you for doing that. >> Thank you. >> We're going to turn it back over to use Scott. >> Thanks, Maddy and Dan, that was great. With that you've seen a lot of the cool technologies that we're releasing with.NET6. My ask to you is go grab.NET6 today, download Visual Studio 2022 today. Go try the upgrade assistance and try out the MAUI previews. I will tell you, sitting back and being part of the keynote and watching all the things that we released today is never a better time to be a done a developer. Please have a great conference and ask us lots of questions on Twitter. We're going to be there all week. Thank you.
Info
Channel: dotNET
Views: 23,433
Rating: undefined out of 5
Keywords: .NET
Id: gYQxBHjRNr0
Channel Id: undefined
Length: 69min 55sec (4195 seconds)
Published: Tue Nov 09 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.