How to read your own config file with a VSTools Application

Dave DueskThis article is a result of a couple of recent support incidents where developers would like to read a config from from a Visual Studio Tools (VSTools) addin. VSTools is a special situation because for one, it is a dll, not an exe, and second it only runs if GP is running. VSTools can automatically access the dynamics.exe.config file, steps on how to do that are outlined in KB Article 933930 Secure Link.  The KB is for 9.0 and references the Dynamics.config file, but it also works for the Dynamics.exe.config on 10.0.

In this case, we don't want to use the dynamics.exe.config, we want to use our own config file. Since we are working with a dll, there is no automatic reading from config files like with an exe. Obviously, there is more than one way to handle this and there may be a better way.  This is just one way, that I know works, and it's not too difficult.

This article shows a method to use xml to read the data from a config file. The main VSTools project is called DynamicsGPAddin.dll.  

  1. The config file is named DynamicsGPAddin.dll.config and is deployed to the Addins folder in the main Microsoft Dynamics GP directory.  The config file contains the following information.  You can define this however you want, this just a sample config file.   
    <?xml version="1.0" encoding="utf-8" ?>
    <supportedRuntime version="v1.1.4444"/>
    <requiredRuntime version="v1.0.9999"/>
  2. The name of the VSTools application is DynamicsGPAddin.dll and contains a form with a button and two text fields.  The button reads the config file and displays the data on the window fields.  In order for the code to execute, references to the following must be marked. 
  3. The button code is as follows:

C# Code Example

        private void button2_Click(object sender, EventArgs e)
        { //
            // Verify the configuration file exists.
            string aConfigPath = System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName + ".config";

            if (System.IO.File.Exists(aConfigPath) == false)

            // Read the runtime versions.
            XmlNode xmlNode;
            XmlNodeList xmlList;
            XmlDocument xmlDoc = new XmlDocument();
            string aRequiredVersion = "";
            string aSupportedVersion = "";

        //navigate the xmldoc to get to the node you want. 
            xmlNode = xmlDoc.DocumentElement.SelectSingleNode("startup");
            xmlList = xmlNode.SelectNodes("supportedRuntime");

            foreach (XmlNode xmlNodeS in xmlList)
       //Get the attribute value
                aSupportedVersion += "," + xmlNodeS.Attributes.GetNamedItem("version").Value;
            aSupportedVersion = aSupportedVersion.Substring(1);

            aRequiredVersion =
            if (aRequiredVersion != "")
                textBox2.Text = aRequiredVersion;  //set a field on the form

            if (aSupportedVersion != "")
                textBox3.Text = aSupportedVersion; //set a field on the form


MBS Dev Support 

// Copyright © Microsoft Corporation. All Rights Reserved.
// This code released under the terms of the
// Microsoft Public License (MS-PL,