Migrating from VBA to .NET Desktop Add-ins Lesley Bross Portland State Universitylbross@pdx.edu March 29, 2011
Project background CSAR engaged in a multi-year agreement with the USDA-NRCS, National Weather and Climate Council (NWCC) to develop a spatial decision support system (SDSS) The new SDSS is intended to replace the USGS GIS Weasel tool used by NWCC to improve water forecast accuracy The project was funded by USDA-NRCS National Water and Climate Center (CESU Agreement #: 68-7482-10-514)
More background GIS Weasel’s last release was in 2003 The GIS Weasel is used to: Prepare watershed GIS layers for Areas Of Interest (AOI) Delineate Hydrological Response Units (HRU) Generate HRU physical parameters that are used in hydrological models to forecast water supply
Basin Analysis GIS (BAGIS) phase completed 2009-2010 (See Dr. Duh’s session tomorrow at 1:30p)
Our conundrum VBA is going away But we want to be able to use all that VBA code we just finished writing for the AOI definition phase … Project requirements Users are accustomed to using ArcMap in their workflow and wish to continue doing so Solution is easy to share (e-mail an .mxt) Installation cannot modify the Windows registry (security) Simple development framework
What about .NET add-ins ? Install as plug-in to ArcMap; No Windows installation required Single file - simple to distribute E-mail attachment Well-known folder (network location)
What about .NET add-ins ? 3) .NET add-in Development framework is robust and relatively easy-to-use Wizards assist with adding components No need to write COM interfaces Benefits of .NET development environment (Intellisense, debugging, unit testing) Access to entire library of VB .NET form controls (DataGridView, Tooltip, etc.)
Development environment ArcMap 10.0 desktop client Microsoft IDE (Integrated Development Environment) Visual Basic 2008 Express (free)http://www.microsoft.com/express/downloads/ Visual Studio 2010 Professional (free for 90 days with registration)
.NET framework: installed by default with Microsoft IDE
Available on ArcMap Install CD May also want to install VBA support
IDE Express vs. Pro - ArcGIS Templates Packaging: Packaging for COM (.dll) deployment; Missing from Express but not needed for add-ins ArcGIS Snippet Finder doesn’t work as documented in Express Screenshots in documentation aren’t quite the same in Express Debugger configured manually in Express (ArcGIS templates can cover this)
C# or VB .NET ? Familiarity with Visual Basic from using VBA made VB .NET an easier transition VB .NET provided a migration path for our existing VBA scripts Industry trends towards C# - ESRI Dev Summit
Converting VBA code to use in .NET 1) Export forms and code modules from inside the VBA editor. Forms cannot be converted but their associated code can be exported.
Converting – step 2 2) Dust off an old copy of Visual Basic 6 and create a new project. Add your exported VBA files to this project. “Washing” the code through VB6 allows you to run the VB upgrade wizard.
Converting – step 3 3) Open the VB 6 project in Visual Basic 2008. The .NET version of VB will recognize the VB 6 project and volunteer to upgrade it to Visual Basic 2008.
Converting – step 4 4) Create a new Visual Basic 2008 ArcMap Add-In project per ESRI guidelines
Converting – step 5 5) Recreate the forms from the VBA project. Note: using the same field names results in less work when migrating the code. The add-in framework supports both ESRI DockableWindow and Windows Form objects for the UI.
Converting – step 6 6) Copy and paste the code from the converted project to the new project. Clean up warnings and review comments added by the conversion routine
Language differences There are lots! (see references at end) Application: Application -> My.ArcMap.Application Document: ThisDocument -> My.ArcMap.Document Exception handling: On Error GoTo / On Error Resume Next ->Try Catch Finally and throwing exceptions
Our solution Leave BAGIS (phase 1) tools in VBA with their toolbar Develop HRU delineation tools on a separate toolbar with VB .NET Convert re-usable functions from VBA to VB .NET using aforementioned process Forms were not converted
What is unit testing? Testing individual pieces/modules of code (functions or subs) Provide known inputs and check output for expected results; Replaces user interface NUnit: open source testing framework for .NET; Integrates with VB Express/Visual Studio. It’s free!
Using NUnit Download/install .exe from the NUnit website Create a project separate from ArcObjects project; No templates Add nunit.framework to project assemblies Set NUnit as debug application; You can step through code while running Nunit tests NUnit debug configuration will vary depending on IDE
NUnit organization Testing subs are in separate module from code they are testing Testing subs are stored in test folder Test data may also live in test project Test project separate from Add-In project Code modules are copied from test project to Add-In project when are validated No testing subs/data in Add-In project; No forms in test project
Migrating VBA/VB6 ArcObjects Applications to .NET: http://proceedings.esri.com/library/userconf/devsummit08/papers/migrating_vba-vb6_arcobjects_applications_to_net.pdf
The GIS Weasel!!http://wwwbrr.cr.usgs.gov/projects/SW_MoWS/software/weasel_s/weasel.shtml
Walkthrough: Building custom UI elements using add-ins:http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Walkthrough_Building_custom_UI_elements_using_add_ins/0001000001ms000000/