SIGN UP MEMBER LOGIN:    
ARTICLE

Enhanced MSI Analyzer in .NET using C# and Windows Forms

Posted by Sateesh Arveti Articles | Windows Forms C# September 24, 2008
This application allows us to view and update the contents of an MSI file.
Reader Level:
Download Files:
 

Enhanced MSI Analyzer in .NET using C# and Windows Forms

 

Most of us are quite familiar in creating MSI or Setup for our applications. By using a MSI, we can make sure all dependencies for running the application will be placed properly. MSI is the best option available on Windows OS for packaging and distributing our application. For .NET developers, Visual Studio presents lot of features in creating setup and deployment projects for our application. But, there are no built-in tools in Visual Studio to look into the MSI contents. And that too, to make a small change in MSI, it requires rebuilding the entire Setup Project. So, I think it’s better to design an application that will analyze the MSI and give the details of it along with capability of updating it without rebuilding.

 

So, I design this application in VS.NET 2008 using C# and windows forms. I will explain features provided by this application, followed by its design and coding.

 

Features present in this application:

  • It allows us to look into the contents of the MSI.
  • It allows us to export the contents of the MSI.
  • It allows us to update commonly changing properties without rebuilding it.
  • Easy to use UI.
  • Now, Updating an MSI is quite simple.

Outline of the MSI Database:

 

In order to access MSI database in .NET, we will follow below steps:

 

  • Create an instance of Installer, Database, View and Record.
  • Open the database using Installer’s OpenDatabase method.
  • Prepare a Select query which is having syntax similar to SQL.
  • Pass that query to OpenView method of the Database object.
  • Execute the query by calling Execute method of the View object.
  • Fetch the records by using Fetch method of the View object.
  • If we want to update, delete, insert data into the MSI tables, we can follow the same steps by passing the update, insert SQL syntax query instead of Select query.
  • MSI database won’t support all operators of SQL.

 

 

Now, create a new Windows Application using C# in VS.NET 2008 and name it as MSI Analyzer. Add controls to Main Form (frmMSI) as shown below:

 

Add a reference to COM based MSI.dll present in system32 folder of your machine.

 

Now, I will outline functionality of few main controls in the application:

 

·         openMSIdialog: This control is used to select the MSI file.

·         MSInotifyIcon:  This control is used the show/hide the application.

·         recentMSIList:   This control is used to maintain the list of MSIs opened recently.

·         statusStrip1:  This control is used to show count of tables/rows present in the MSI database.

menuStrip1 (Menu Strip):

 This Control is having Main Menu with following items in it:

 

·         Browse: To select the MSI.

·         Analyze: To start analysis of the selected MSI.

·         Export Tables: To export the selected tables present in the MSI database.

·         View Important Properties: To look and modify commonly changing properties like target location, version etc.

·         Commit Changes: To commit the changes made to the MSI.

·         Exit: To exit the application.

 

I had placed a SplitContainer control on the main form. One of the panel is used to show list of tables present in MSI database. And the other panel is used to show the records present in the selected table in a GridView.

 

Whenever we create an MSI, it will internally maintain a database with all the details of it like version, files, author etc. The main functionality of this application is to list all tables present in the MSI database along with updating capability.

 

We will create another form, which will allow us to export the MSI contents to text files for future reference as shown below:

 

 

This form will list all the tables present in the selected MSI file. We can select which all tables are needed to be exported.

 

We will create last but not least form, which will allow us to view and update commonly changing properties as shown below:

 

 

 

 

Here, I placed a Tab panel having two panels in it. One panel will list the properties like Name, Author, files and the other panel will list all the dialogs (like Welcome Screen, Progress Screen etc) of the MSI.

 

By this, we completed Design part. Let’s start with the coding details:

 

Functionality present in MSIItems.cs:

 

In order to create buttons for each table present in the selected MSI, I implemented concept of control array of VB here. Here, I just created a class named MSIItems which inherits from System.Collections.CollectionBase. And in constructor of this class, I am passing container (Panel) for this buttons. Than, I added a method to implement add new button (table) to the Panel.

 

Functionality present in frmMSI.cs:

 

After selecting the MSI file by using Browse menuitem. When we click on Analyze menuitem, it will perform following steps:

 

  • Opens the MSI database by using OpenDatabase of the Installer object.
  • It will get the list of tables present in the MSI database from “_Tables”.
  • It will create a button in the panel1 for each table of the database.

 

When we click on a table button, it will perform following steps:

 

·         Get the columns details of the selected table using “_Columns”.

·         Creates a DataTable and adds the columns to it based on the column details.

·         Creates a DataRow for each record present in the selected table and adds it to the DataTable.

·         Binds the DataTable to the GridView (dgContents).

 

Functionality present in frmExport.cs:

 

This will list all the tables of the MSI. We can select the tables that are needed to be exported. We are using Export method of the MSI database object to store in a text file format.

 

Functionality present in frmImpProperties.cs:

 

This will list commonly changing properties like name, version, dialog buttons etc.

It will load the files present in the MSI. Later, it will load all the dialogs present in the MSI by using “Control” table of the MSI. Here, we can update the properties of all dialogs like caption, height and width of the buttons like Next, Back etc.

 

After making changes to any of the Dialog properties, we have to click on Update button of the corresponding row to commit those changes.

 

Finally, some code is added to include an Update button, highlight the edited row in Dialog grid, list recently opened MSIs etc. And, the final output will be like this:

 

 

 

A small sample of the MSI changed by the application:

 

 

 

 

 

Like this, we can change the dialog properties, version, author etc without rebuilding it. This tool will be really useful, if we are customizing the same MSI for different clients.

 

We can still enhance this application by improving UI, adding extra functionality like adding, updating files present in the MSI.

 

By using this application, we can easily view and update the MSI without any extra effort. I am attaching source code for further reference. I hope this code will be useful for all.

  

Login to add your contents and source code to this article
Article Extensions
Contents added by Rama charan on Feb 21, 2012
The Upgrated project files to support for Visual Studio 2010 with .net framework 4.0 are attached.
share this article :
post comment
 

Thank you very much. It helped me a lot. Code is clear and easy to use.

Posted by Rama charan May 23, 2012

hi, thxs for this Example
i have a problem to modify an msi file with a WCF service:
   i can't close the file after modification and when i try to open it i have this message
"this file is used by DevServer .exe"
so who can help me
thxs

Posted by az za Apr 30, 2010

one of the best Article.

Posted by prasad k Nov 10, 2009

yet to check

Posted by Ajay Choudhary Jul 26, 2009
Nevron Gauge for SharePoint
Become a Sponsor
PREMIUM SPONSORS
  • ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications. Visit DynamicPDF here
    Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites - Click Here!
Nevron Gauge for SharePoint
Become a Sponsor