Page tree

Infor-Med Medical Information Systems Inc. (“Infor-Med”) used gmStudio to develop an advanced Custom Upgrade Solution for their Praxis EMR Product.  Praxis® EMR is more than an electronic records (EMR/EHR) system. Praxis is a template-free medical tool. Unlike rigid and cumbersome templates, Praxis uses artificial intelligence called Concept Processing that learns from you. No other EHR allows smarter and higher quality medicine than Praxis EMR.   

Baseline Metrics




1,484K LOC Logic and 95K LOC GUI in 6,794 code files
472 Forms, 2 MDIForm, 5,094 Classes, 667 UserControls, and 528 Modules organized into 130 VBPs.


4 EXEs, 59 DLLs, 50 Controls, 11 OLE EXEs, 


85,019 unique subprograms
18,688 subroutines, 21,885 functions, 27,695 properties, 1,629 externs, 13,539 handlers, and 1,583 events. 


1,274 unique UI containers containing 9,362 instances of 737 different kinds of controls.


128,010 calls to external COM components.
The diversity of COM members is 11,542 unique members from 2,186 classes in 172 COM components.


2,572 calls to 355 unique entry-point APIs from 22 libraries.
Win32 API Calls are made from 970 different user procedures.

Project Phases

GM assisted with the following three phases of the project:

  • An Assessment, Definition, and Planning engagement
  • A Standard Upgrade Phase resulting in Standard Upgrade Solution and build-complete code for the entire Praxis system. This solution produced a direct C# translation generated from the VB6 code and a C# stub framework generated for the external COM platform dependencies.
  • A Two-week intensive knowledge transfer workshop where GM and Praxis developers reviewed and experimented with the Standard upgrade solution and learned how to reproduce and improve the results using gmStudio in the Praxis environment
  • A Custom Upgrade Phase implementing numerous custom upgrade features and providing a runnable .NET system. During this phase, GM provided only Q&A technical support and the Praxis team completed the custom upgrade in house

GM and Praxis followed the Tool Assisted Rewrite Methodology.  All three phases were completed in nine months with a staffing level of one part-time GM resource and four full-time client developers. 

The Custom Upgrade Phase was conducted over a six months period and produced a Custom Upgrade Solution that could be used to automatically rewrite the Praxis EMR codebase to C# with all of the custom upgrade features listed below.  On a fast Windows 10 development machine, the custom upgrade process runs, from start to finish, in about 10 minutes generating the 156 application projects and integrating them in a VS2019 solution.

Custom Upgrade Features

The collection of features integrated and delivered in the Custom Upgrade Solution are summarized below:

COM API/Control Upgrades

  • WebBrowser upgraded using mscomct2.Winforms.Refactor rules
  • MSXML2 upgraded using GM.msxml6.dll
  • ADODB upgrade to MigrationSupport SqlClient using msado15.dll.Refactor rules
  • MSComDlg: upgrade to WinForms CommonDialog classes using comdlg32.ocx.Refactor rules
  • MSComCtl upgraded using Refactor.mscomctl.ocx
    • ImageList/ListImage
    • ListView/ColumnHeader
    • ProgressBar
    • StatusBar/Panel
    • TabStrip/Tab
    • Toolbar/Button
    • TreeView
  • MSCOMCT2 upgraded using mscomct2.Winforms.Refactor rules
    • DTPicker
    • FlatScrollBar
    • UpDown
  • Scripting upgraded to System.IO using using Scrrun.dll.Refactor rules
    • Dictionary
    • Drive
    • Encoder
    • File
    • FileSystemObject
    • Files
    • Folder
    • TextStream
  • References to In-house C++/COM dll upgraded to COM Interop (more than 1300 referenced Coclasses)
  • References to In-house C++/ActiveX Controls upgraded to COM Interop.

 Language Upgrades

  • Coding Style: used optional parameters and named arguments
  • Line: upgrade emulated with WinForms Label.
  • Error handling: upgrade to Try/Catch; simplify On Error GoTo; Selectively removed error handlers used for stack tracing
  • ByRef/ByVal: optimize parameter marshaling
  • Variant/Object Type Inference: optimize

Structural Matters

  • Shared Files Consolidation: consolidate 22 unique shared files into assemblies referenced from the generated application projects
  • Integrate hand-coded content: 371 Replacements Rules, 15 Function Reauthor and 3 file replacement.
  • VS2019 Solution: generate a solution file integrating the full application stack: 130 translated projects, 26 stub implementations and 201 hand-coded .NET projects


  • Replaced Win32 wrapper functions with functionally-equivalent hand-coded functions or intrinsic framework APIs

Value Added Features

  • Integrate with hand-coded .NET function library
  • 4 updates of the VB6 codebase during the update process
  • 3 gmStudio Updates during the migration process implementing improvements to support some requested features

Infor-Med Medical Information Systems Testimonial (CEO)
It has been my privilege to have met and worked with the Great Migrations team in this complex Praxis "great migration" from VB to C#.  Praxis was built over 20 years on multiple Windows DLLs, many of which were coded in Visual Basic. Prior to signing on with Great Migrations, we had estimated the conversion to C# would take about 10 years.  Thanks to the Great Migrations, in less than one year we completely finished our application upgrade. In fact, it works superbly well in C#. Our software flies! Great Migrations delivered more than they promised. They are passionate about their clients' success and they became our allies in this battle. Without their help, I do not believe we would have succeeded in any reasonable time. This is the advantage of Great Migrations over their major competitor. The other company promises that the software alone will do it and they delegate support to dozens of techs that do not make a point to understand our application and do not even understand their own technology because they did not build it. Great Migrations is constantly improving their software with each new client. So, for you, it will be even better than it was for us. One of the things I had requested from their competitors was to allow us to speak with the actual tech that would work with us during the migration.  The competitor could not do this, they said, because they could not tell who that person would be beforehand.  Clearly, we would have made a bad mistake to go with them even though they have an important brand name. If you need to convert your application from VB to C# don't even think about any other option. 

Thank you, Mark Juras, for all your wonderful help this year. We could not have done it without you!

Richard Low MD,
CEO Praxis EMR.

and From the Praxis.NET Release Announcement

Working with Great Migrations, a tech company that specializes in upgrading software, we were able to automatically translate millions of lines of code from Visual Basic Code to C#, thus solving a daunting task and saving our team many years of work. We were left with only about five percent of the code which needed to be completed by hand...

Infor-Med Medical Information Systems Testimonial (Development Manager)
Infor-Med Corp. wanted to migrate its 1.8 million lines product PraxisE­MR.   We chose Great Migrations’ gmStudio after considering two different tools. We liked the conception and implementation of the tool the most, as it allowed us to decide how to migrate different sections of the product.

We started on late June 2020 with a test project which was successfully completed and served as a hand-on learning process.

Then (mid-July 2020) we received a pretty complete introductory course to the concepts and usage of gmStudio along with an almost fully translated project of our own code.

We froze development on that baseline code and, with the invaluable help from Mark Juras, we started the journey to transform the translations into correctly executing code.

We received prompt responses to our requests when shortcomings of the tool were found (we cannot call them errors or failures, they mostly related to VB6 idioms we use that were not solved by the general solutions in the tool).

By the end of October, we reached a point where the executables actually ran.  We made the decision to stop using gmStudio regularly and start the final stage of the migration finishing the translations. (We did run yet another full translation in November with the latest release of gmStudio to see improvements).

By now (mid-March, 2021) the three applications that compose our product are about 90% complete and we expect to have them fully functional around May. 

Some comments on using gmStudio:

  • The tool is great for translating the VB6 code into the C# version of the VB6 code.  Don’t expect to receive full C# programming style right out of the box because there are conceptual differences between the VB6 and the C# paradigms. GM has done a great job closing the gaps between these two, but major design changes require using advanced features of the tool or reworking the C# by hand.  We only used these advanced capabilities for a few specific redesign issues that would have required too much manual work.
  • I suggest adding version control to the loop at an early stage. We found the use of git invaluable. There are small quirks of code that we programmers like to have our own way which a tool could not always implement, so each time you translate you go back to that spot and rearrange it.  We added git patch operations to the gmStudio process to automagically bring back those small changes and it worked!
  • You (and only you) must make a clear decision of when your code is good enough to start finishing by hand.
  • Although I thought otherwise, it’s a good thing that gmStudio translates the user interface into WinForms because that way the result is closer in shape and meaning to the original, getting you to a running product with a working UI sooner (even if sometimes the rendering is not exactly as expected).
  • Last but not least, it is paramount to success to have knowledgeable people about the legacy application. There are decisions to make that can be difficult if you don’t have a deep understanding of the source code.

I will just add here that gmStudio performed for us better than expected in regard to the overall process.

Miguel Pinkas
Development Manager at Praxis EMR

  • No labels