I just wrote my first installer for an ArcGIS 10 COM component. I realize that ESRI has created this new thing called an add-in, but since I want my component to work with both 9.3 and 10, I figured it would be easiest to keep most things the same. So I built my base project, fired up ArcGIS 10, and my toolbar was right where I expected it to be. Then I built a setup program using the
9.3 instructions on the ESRI website. I built the setup program, ran it, started ArcGIS, and my toolbar was nowhere to be found. Hmmm....
Turns out that with version 10, ESRI decided not to use the regular Windows COM registration services and instead uses its own
registration utility. This utility can be used to register COM components, or they suggest using the Add From File option on the Customize dialog in ArcMap. I didn't like that solution because that's asking a bit too much for some of our users (don't ask what they're doing using ArcMap!). I want them to just double-click a file icon.
So here's how I created my installer for ArcGIS 10:
- Open the solution that you want to create an installer for.
- Add an Installer Class to the project that you want to create the installer for.
- Add the following code to the new Installer class. Note that you may want to enclose things in try/catch blocks. I have it show an error message if it takes more than 5 seconds to unregister the component.
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string esriRegAsmFilename = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles),
"ArcGIS\\bin\\ESRIRegAsm.exe");
Process esriRegAsm = new Process();
esriRegAsm.StartInfo.FileName = esriRegAsmFilename;
esriRegAsm.StartInfo.Arguments =
string.Format("\"{0}\" /p:Desktop", base.GetType().Assembly.Location);
esriRegAsm.Start();
}
public override void Uninstall(System.Collections.IDictionary savedState)
{
base.Uninstall(savedState);
string esriRegAsmFilename = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles),
"ArcGIS\\bin\\ESRIRegAsm.exe");
Process esriRegAsm = new Process();
esriRegAsm.StartInfo.FileName = esriRegAsmFilename;
esriRegAsm.StartInfo.Arguments =
string.Format("\"{0}\" /p:Desktop /u", base.GetType().Assembly.Location);
esriRegAsm.Start();
if (!esriRegAsm.WaitForExit(5000))
MessageBox.Show("ESRI unregistration failed");
}
- Make sure the Specific Version property for the referenced assemblies in the project is set to False and rebuild the project.
- Add a Setup Project to your solution.
- Right-click the new Setup project in Solution Explorer and select Add | Project Output...
- In the dialog box, select the project you want to deploy from the pulldown menu and then select Primary output and click OK.
- This will generate a list of detected dependencies. Right-click and exclude all of the ESRI assembles and stdole.dll.
- Open the Properties pane for the .tlb file in the dependency list, and change the Register property to vsdrfDoNotRegister.
- Right-click the Setup project in the Solution Explorer and select View | Custom Actions.
- In the Custom Actions window, right-click the Install folder and select Add Custom Action...
- In the dialog box, select File System on Target Machine from the pulldown menu and then double-click Application Folder.
- Double-click Primary output from <AssemblyName>.
- Repeat this for the Uninstall folder in the Custom Actions window.
- Build the setup project.