October 2005 - Posts

Three Config File Reading Examples

Here are three examples of config file reading.  I couldn't easily find enough information in one place and the MSDN documentation wasn't obvious enough.

 

This is a very generic snippet that can be pasted in a winform app.  It's not rocket science, but I'm sure it will save someone a little time.

 

Type 1 - Regular configuration file settings

Type 2 - Section that uses nodes and the IConfigurationSectionHandler interface

Type 3 – Section that uses attributes and a class that inherits from ConfigurationSection

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

       <!--

       Helpful Articles and Documentation:

       http://www.dotnetbips.com/displayarticle.aspx?id=127

       http://msdn2.microsoft.com/en-us/library/system.configuration.configuration.getsection

       http://msdn2.microsoft.com/en-us/library/system.configuration.configuration

       http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcondeclaringcustomconfigurationsections.asp

       http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingnewsectionhandlers.asp

       -->

 

       <!--Must specify a group to layout nodes in the section and not just attributes.-->

       <configSections>

              <sectionGroup name="Type2">

                     <section name="Field1" type="MultiConfigSections.MultConfigurationSectionHandler2, MultiConfigSections"/>

                     <section name="Field2" type="MultiConfigSections.MultConfigurationSectionHandler2, MultiConfigSections"/>

                     <section name="Field3" type="MultiConfigSections.MultConfigurationSectionHandler2, MultiConfigSections"/>

              </sectionGroup>

 

              <section name="Type3" type="MultiConfigSections.MultConfigurationSectionHandler3, MultiConfigSections" />

       </configSections>

 

       <Type2>

              <Field1>c:\File2.txt</Field1>

              <Field2>1234</Field2>

              <Field3>Whatever!!</Field3>

       </Type2>

      

       <Type3 FileLocation="c:\File3.txt" UserId="4321" SomethingElse="!!revetahW" />

 

       <appSettings>

              <add key="Field1" value="c:\File1.txt" />

              <add key="UserId" value="9876" />

              <add key="Field3" value="Etc..." />

       </appSettings>

 

</configuration>

 

//  Must add a reference to System.Configuration assembly for the project.

using System.Configuration;

 

namespace MultiConfigSections

{

       public partial class MultiConfigSectionsForm : Form

       {

              public MultiConfigSectionsForm()

              {

                     InitializeComponent();

              }

 

              /// <summary>

              /// Basic setting retriever.

              /// </summary>

              private void btnGetSetting1_Click(object sender, EventArgs e)

              {

                     txtFileLocation.Text = ConfigurationManager.AppSettings[SettingField.Field1.ToString()] as string;

                     txtUserId.Text = ConfigurationManager.AppSettings[SettingField.UserId.ToString()] as string;

                     txtSomethingElse.Text = ConfigurationManager.AppSettings[SettingField.Field3.ToString()] as string;

              }

 

              /// <summary>

              /// Retrieve section with the section path.

              /// </summary>

              private void btnGetSettings2_Click(object sender, EventArgs e)

              {

                     SettingType settingType = SettingType.Type2;

 

                     string fileLocation = GetImportSetting(settingType, SettingField.Field1);

                     string userId = GetImportSetting(settingType, SettingField.Field2);

                     string somethingElse = GetImportSetting(settingType, SettingField.Field3);

 

                     txtFileLocation.Text = fileLocation;

                     txtUserId.Text = userId;

                     txtSomethingElse.Text = somethingElse;

              }

 

              /// <summary>

              /// Retrieve settings using the class in one call to the ConfigurationManager class.

              /// </summary>

              private void btnGetSettings3_Click(object sender, EventArgs e)

              {

                     //  Read a specific config file or just default to the current EXE.

                     //  Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

                     //  multConfigurationSectionHandler = configuration.Sections[SettingType.Type2.ToString()] as MultConfigurationSectionHandler;

 

                     MultConfigurationSectionHandler3 multConfigurationSectionHandler2 = ConfigurationManager.GetSection(SettingType.Type3.ToString()) as MultConfigurationSectionHandler3;

                     if (null != multConfigurationSectionHandler2)

                     {

                           txtFileLocation.Text = multConfigurationSectionHandler2.FileLocation;

                           txtUserId.Text = multConfigurationSectionHandler2.UserId;

                           txtSomethingElse.Text = multConfigurationSectionHandler2.SomethingElse;

                     }

              }

 

              /// <summary>

              /// Return a single setting.

              /// </summary>

              private string GetImportSetting(SettingType settingType, SettingField settingField)

              {

                     string ret = string.Empty;

                     string sectionName = string.Format("{0}/{1}", settingType.ToString(), settingField.ToString());

 

                     //  The .Net 1.1 Method: 

                     //            ret = ConfigurationSettings.GetConfig(sectionName) as string;

                     //  The .Net 2.0 Method:

                     ret = ConfigurationManager.GetSection(sectionName) as string;

 

                     return ret;

              }

       }

 

       /// <summary>

       /// Group Types.

       /// </summary>

       public enum SettingType

       {

              Type2,

              Type3,

       }

 

       /// <summary>

       /// Field Types.

       /// </summary>

       public enum SettingField

       {

              Field1,

              Field2,

              Field3,

              FileLocation,

              UserId,

              SomethingElse

       }

 

       /// <summary>

       /// Configuration class.  This cannot be an inner class.

       /// </summary>

       class MultConfigurationSectionHandler2 : IConfigurationSectionHandler

       {

              public object Create(object parent, object configContext, System.Xml.XmlNode section)

              {

                     object ret = null;

 

                     if (section.Name == SettingField.Field1.ToString() ||

                           section.Name == SettingField.Field2.ToString() ||

                           section.Name == SettingField.Field3.ToString())

                           ret = section.ChildNodes[0].Value;

 

                     return ret;

              }

       }

 

       /// <summary>

       /// Configuration class.  This cannot be an inner class.

       /// </summary>

       class MultConfigurationSectionHandler3 : ConfigurationSection

       {

              [ConfigurationProperty("FileLocation")]  //  Must Match XML Case

              public string FileLocation

              {

                     get { return this["FileLocation"] as string; }

                     set { this["FileLocation"] = value; }

              }

 

              [ConfigurationProperty("UserId")]

              public string UserId

              {

                     get { return this["UserId"] as string; }

                     set { this["UserId"] = value; }

              }

 

              [ConfigurationProperty("SomethingElse")]

              public string SomethingElse

              {

                     get { return this["SomethingElse"] as string; }

                     set { this["SomethingElse"] = value; }

              }

       }
}

Posted by vblasberg with 1 comment(s)

Any VSTO Samples for HTTP _AssemblyLocation0 ??

I really like the feature of Word or Excel looking at _AssemblyName0 and _AssemblyLocation0.

 

Where's a VSTO sample or walkthrough on Word documents using managed assemblies from an HTTP location?

 

Sure, MSWord finds the assembly, but it still can't resolve security errors: 

 

"The current .Net security policy does not permit SomeDoc.doc to load custom macros."

 

I've combed the web for hours but still haven't found the hidden text to make it work.  I've edited every policy and zone but it still won't work unless it's Intranet or Local. 

 

Can't it just be simple?  Of all of the VSTO samples, how about one that has a DOC, and assembly, the steps to authorize the download location from an

HTTP, and just work if the user edits the security policy just as the documentation says.

 

My two newsgroup requests received no love.  I see many areas where an internet deployment is really great.

 

Any pointers or code snippet would be appreciated.

 

Thanks

-VinceB

 

Posted by vblasberg with no comments
More Posts