Click here to Skip to main content
15,867,308 members
Articles / Programming Languages / C#

Under the Hood - Part 3: Internals of How the Application is Installed and Run – WinRT, Windows 8, C++, C#.NET, Metro

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
5 Mar 2012CPOL5 min read 21.2K   7   2
Internals of how the application is installed and run – WinRT, Windows 8, C++, C#.NET, Metro

We have developed a C++ WinRT Component DLL & C#.NET application in the post here:

We have seen the compiler generated components for making the C# application access the C++ WinRT component here:

See the post on First Look at What’s New in Windows 8 here.

Going further, I created a C++ Metro application and accessed the C++ WinRT Component DLL from this application. The interesting part here is that C++ applications is XAML based. No more .RC and resource.h files in C++ (for metro). We will explore the C++ application in another post. In this post, let us walk through the packaging and installation process that happens in the background during building and deploying of the applications.

Basically, there are two registrations for our application.

  1. Extension registration
  2. Class registration

Figure 1 (from Build con) shows the relation between the two.

image

Figure: Slide related to Extension Catalog and Class Catalog shown @ Build con.

Go to Visual Studio 2011 –> Solution Explorer –> CSharpApplication project, here you can find a file named Package.appxmanifest as shown in figure 1. This file has most of the information needed to deploy the application. This is the information that Windows uses to identify the application. Package Name is the name used in most of the identification process.

image

Figure 1: Package.appxmanifest file in Visual Studio 2011 Solution Explorer.

Code snippet of Package.appxmanifest file.

XML
<?xml version="1.0" encoding="utf-8"?>
 <Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
   <Identity Name="CSharpApplicationCallingCPPComponent" 
   Publisher="CN=Kishore" Version="1.0.0.0" />
   <Properties>
     <DisplayName>CSharpApplication</DisplayName>
     <PublisherDisplayName>Kishore</PublisherDisplayName>
     <Logo>Images\StoreLogo.png</Logo>
     <Description>CSharpApplication</Description>
   </Properties>
   <Prerequisites>
     <OSMinVersion>6.2</OSMinVersion>
     <OSMaxVersionTested>6.2</OSMaxVersionTested>
   </Prerequisites>
   <Resources>
     <Resource Language="en-us" />
   </Resources>
   <Applications>
     <Application Id="App" Executable="csharpapplication.exe" 
     EntryPoint="CSharpApplication.App">
       <VisualElements DisplayName="CSharpApplication" 
        Logo="Images\Logo.png" SmallLogo="Images\SmallLogo.png" 
        Description="CSharpApplication" ForegroundText="light" 
        BackgroundColor="#222222" InitialRotationPreference="portrait">
         <SplashScreen Image="Images\SplashScreen.png" />
       </VisualElements>
     </Application>
   </Applications>
   <Capabilities>
     <Capability Name="internetClient" />
   </Capabilities>
 </Package>

The applications implement contract like search contract, share, play queue contract. Those contract registrations are the extensions registration for the operating system. Tile that you see in the Windows start page is just another contract activation, i.e., windows.launch contract. So if you go to HKEY_CURRENT_USER\Software\Classes\Extensions\ContractId\Windows.Launch, you can find your application package id that we saw in figure 1. Everything under Windows.Launch is organized by package ID as shown in the figure 2 below.

image

Figure 2: Registry settings showing the registered Extensions.

From figure 2, we can see our package HKEY_CURRENT_USER\Software\Classes\Extensions\ContractId\Windows.Launch\ PackageId\csharpapplicationcallingcppcomponent_1.0.0.0_x86_neutral_kb63pw67p0swp. This package has a ActivatableClassId key. Under that, we see App as shown in figure 3. This is the class registration for this extension.

image

Figure 3: App registry settings for your application.

Let us see how the class registration for the applications looks like. First, we have extensions which say I implement this contract for example, I implement this launch and then we have classes. The extensions point to the classes. classes are actually the implementation. All applications are just Windows Runtime objects to the Windows OS, this is where all it starts. This is the Windows runtime class that the OS knows about for your application.

The interesting part is in the class registration for the application. If we go up in the registry editor, we should see a registry key called ActivatableClasses at HKEY_CURRENT_USER\Software\Classes\ActivatableClasses, this is where the class registrations for all of our applications are. Here again, we find package. All extensions, all classes are organized based on the package. That means our application or package has unique set of classes and they don’t share extension points or classes with other applications. They are all unique for our app. If we expand it, we see ActivatableClassId, the same name we saw in extensions. Here, we should find the App classId. This is the WinRT class registration. This is the same for all types of applications, libraries, etc.

Here, we can see some registration attributes . The ActivationType is an important one. Windows Runtime supports two activation styles:

  1. InProcess activation
  2. Out of process activation

So Windows Runtime supports InProcess activation where we provide the DLL and windows load that into the process and it also supports out of process activation, where we will provide an EXE and windows will launch the EXE as your class implementation.

Registry key values:

ActivationType = 1 indicates its out of process activation class. Out of process classes have a server. We have to know where the executable is, so there is a server registration here.

ActivationType = 0 indicates its in process activation

Out of process has a server and so there is a server registration here. Server with value App.AppXpdnr4x0evrk1yjmz5xfw2ksncfcjc5er.mca as shown in figure 4.

image

Figure 4: Server registry values for your application.

In figure 3, below the ActivationType, we can find Server attribute and it contains the App.AppXpdnr4x0evrk1yjmz5xfw2ksncfcjc5er.mca we got from the above Server value. The server registration, tells the windows runtime enough information about what code we actually need to get from the disk and start running to get the app up and running. The ExePath attribute gives the path to the EXE.

Windows runtime supports two apartment models. MTA & STA. If you have worked in VC++ COM, COM+ earlier, then you might have programmed the components for Multi Threaded Apartment model & Single Threaded Apartment model.

Let us see some more ActivatableClassId entries for Windows Runtime present at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime as shown in figure 5.

image

Figure 5: Windows Runtime classes information.

Finally, the slide that caught my attention was the deployment pipeline process shown in Figure 6 that shows the overall view of the above mentioned information.

image

Figure 6 showing the role of the deployment engine @ Build Con.

"Only those who risk going too far can possibly find out how far they can go." – T.S. Eliot

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
CEO Astrani Technology Solutions
United States United States
Kishore Babu Gaddam is a Senior Technology Consultant, Technology Evangelist turned Technology Entrepreneur and a regular speaker at national conferences, regional code camps and local user groups with over 14 years of experience in software product development. His experience includes building & managing award-winning software development teams, managing customer relationships, marketing and launching new software products & services. Kishore launched his technology career almost 15 years ago with a Robotics software development startup and has served in multiple roles since including developer, innovation leader, consultant, technology executive and business owner.

A technology specialist in C++, C#, XAML and Azure, he successfully published two applications to Windows store http://bit.ly/WinStoreApp and http://bit.ly/FlagsApp.

Kishore is the author of the popular Microsoft Technologies blog at http://www.kishore1021.wordpress.com/ and his work on Portable Class Library project in Visual Studio 2012– .NET 4.5 was featured on Channel 9 at http://bit.ly/msdnchannel9. Kishore enjoys helping people understand technical concepts that may initially seem complex and perform lot of Research & Development on emerging technologies to help solve some of the toughest customer issues. Kishore spends a lot of time teaching and mentoring developers to learn new technologies and to be better developers. He is a speaker at various code camps around Washington DC area, mainly at Microsoft Technology Center for NOVA code camp (http://bit.ly/novacc12), CMAP Code Camp Fall 2012 (http://bit.ly/novacc12), etc. The majority of his software development experience has centered on Microsoft technologies including MFC, COM, COM+, WCF, WPF, winRT, HTML5, RestAPI and SQL Server. You can follow Kishore on Twitter at www.twitter.com/kishore1021. He can be reached on email at researcherkishore@outlook.com

Comments and Discussions

 
QuestionQuestion Pin
Crisan Radu6-Mar-12 2:43
Crisan Radu6-Mar-12 2:43 
AnswerRe: Question Pin
kishore Gaddam6-Mar-12 5:39
kishore Gaddam6-Mar-12 5:39 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.