Monday, February 13, 2017

Ending the Great Debate on Enum Flags

This article explains how enumeration and flags work in C#.NET and how to properly use them.

Wednesday, June 03, 2015

How do i create an InstallShield LE project to install a windows service?

The main solution exist  here
But real help is hiding in the comment:
This option does not start the service after installation. To install service and start it, in solution explorer, select 3. Configure Target System > Services 
Regards to Rajeev

Thursday, November 06, 2014

Visual Studio 2012 Crashes at Startup

The solution for famous problem exists here. But my Registry not included all required keys from the article. In the 3rd page of Google  search was found very small but very effective advice:
You would get above error if ieproxy.dll is not registered properly. Re register Ieproxy.dll.
C:\Program Files\Internet Explorer>regsvr32 /u ieproxy.dll
C:\Program Files\Internet Explorer>regsvr32 ieproxy.dll
C:\Program Files (x86)\Internet Explorer>regsvr32 /u ieproxy.dll
C:\Program Files (x86)\Internet Explorer>regsvr32 ieproxy.dll
Full post exists here.
Thank you, Derek Smith!

Thursday, October 02, 2014

Web.config and config file for every project in solution

Suppose a given project solution: core, data access layer and several "plugin" modules. In order to prevent changes in the core all configurations was moved to web.config. Also we would like that every module will use a dedicated config file because a "plugin" can be added and/or removed.

First solution:
In web.config file in the section "appSettings" available attribute "file" for moving segment of web config to another file. It's nice but we need more then one config file and therefore required additional configurations.Create "sectionGroup":

  1. <configuration>
  2.   <configSections>
  3.     <sectionGroup name="Plugins">
  4.         <section name="Module1" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  5.         <section name="Module2" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  6.     </sectionGroup>
  7.   </configSections>
  8. .....


Module1 and Module2 this is a names of our plugins. Create configuration section for group and define key for path of module config file in every named section:


  1.   <Plugins>
  2.     <Module1>
  3.       <add key="ConfigFile" value="App1.config"/>
  4.     </Module1>
  5.     <Module2>
  6.       <add key="ConfigFile" value="App2.config"/>
  7.     </Module2>
  8.   </Plugins>
  9.   

Create 2 new config files "App1.config" and "App2.config". In the properties of files change  "Copy to Output Directory" to "Copy always". The content of module config file look like this one:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <appSettings>
  4.     <add key="AnyKey" value="Bla-Bla-Bla"/>
  5.     <add key="AnyKey2" value="Bla-Bla-Bla"/>
  6.   </appSettings>
  7. </configuration>

An using code:

  1. class Test
  2. {
  3.     private static readonly Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
  4.         //Get config file
  5.         new ExeConfigurationFileMap()
  6.         {                                                                              //Web.config part   //File name                                         
  7.             ExeConfigFilename = ((NameValueCollection)ConfigurationManager.GetSection("Plugins/Module1"))["ConfigFile"]
  8.         },
  9.         ConfigurationUserLevel.None);
  10.  
  11.     private void Foo()
  12.     {
  13.         var value = config.AppSettings.Settings["AnyKey"].Value;
  14.         Console.WriteLine(value);
  15.     }
  16. }


Second solution:
Add  new section "Plugin". We are use the type DictionarySectionHandler in order to get values as Dictionary:
  1. <configuration>
  2.   <configSections>
  3.     <section name="Plugin" type="System.Configuration.DictionarySectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  4. </configSections>

Add values:

  1. <Plugin>
  2.     <add key="ConfigFileOfModule1" value="App1.config"/>
  3.     <add key="ConfigFileOfModule2" value="App2.config"/>
  4. </Plugin>

Create 2 new config files "App1.config" and "App2.config". In the properties of files change  "Copy to Output Directory" to "Copy always". The content of module config file look like this one:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <appSettings>
  4.     <add key="AnyKey" value="Bla-Bla-Bla"/>
  5.     <add key="AnyKey2" value="Bla-Bla-Bla"/>
  6.   </appSettings>
  7. </configuration>

An using code:

  1. private static readonly IDictionary section = (IDictionary)ConfigurationManager.GetSection("Plugin");
  2. private static readonly  System.Configuration.Configuration config =
  3.     ConfigurationManager.OpenMappedExeConfiguration(
  4.                         new ExeConfigurationFileMap()
  5.                         {
  6.                             ExeConfigFilename = section["ConfigFileOfModule1"].ToString()
  7.                         }, ConfigurationUserLevel.None);
  8. private void Foo()
  9. {
  10.     var value = config.AppSettings.Settings["AnyKey"].Value;
  11. }



Enjoy!





Tuesday, September 16, 2014

How to include value types AND strings in generic constraint.

I'm very like to use generics in the code. Usually generic implementation is working smoothly but exists one small problem with generic value types: cannot use string typed value because System.String is a class.

  1. Foo<string>("abc");



  1. private void Foo(T value) where T : struct
  2. {
  3. //...
  4. }
 
The simple solution is creating overwrite method:

  1. private void Foo(T value) where T : string
  2. {
  3. //...
  4. }

Nice, but not perfect. The beautiful idea was offered by KeithS instead to restrict a value to struct change it to IConvertible. Next types implemented an interface IConvertible but now String can be included in the constraint:
Boolean   
Byte   
Char   
DateTime
Decimal   
Double   
Int16   
Int32   
Int64   
SByte   
Single   
String   
Type   
UInt16   
UInt32   
UInt64 


Final:

  1. private void Foo(T value) where T : IConvertible
  2. {
  3. //...
  4. }



Tuesday, August 26, 2014

C# generation: from '?' via '??' to '???'

C# include several usable but not famous operators. Today we'll consider the generation of  operator '?'.
The first and known from language C old operator '?' was appeared in C# 1.0 in the Visual Studio 2002. An operator using for condition instead to block  if-else:
  1. Random rnd = new Random();
  2. //Long way
  3. bool isLessTo50;
  4. if (rnd.Next(100) < 50)
  5. {
  6.    isLessTo50 = true;
  7. }
  8. else
  9. {
  10.    isLessTo50 = false;
  11. }
  12.  
  13. //Short way
  14. bool isLessTo50 = rnd.Next(100) < 50 ? true : false;

The next '??' was offered 3 years later in Visual Studio 2005. The ?? operator is called the null-coalescing operator. It returns the left-hand operand if the operand is not null; otherwise it returns the right hand operand:
  1. DateTime? dt = GetDate();
  2. //Regular way
  3. if (dt != null)
  4. {
  5.    return dt;
  6. }
  7. else
  8. {
  9.    return DateTime.Now;
  10. }

  11. //Short way
  12. return (dt != null) ? dt : DateTime.Now;

  13. //New way
  14. return dt ?? DateTime.Now;

The last operator '???' was announced in Visual Studio 2012. I'm very like it because he is cutting the validation of object:
  1. class Person
  2. {
  3.  public string Name { get; set; }
  4.  public int ID { get; set; }
  5. }
  6.  
  7. //The program
  8.  Person person = InitPerson();

  9. //Old way
  10. if (person != null)
  11. {
  12.   return person.ID;
  13. }
  14. else
  15. {
  16.   return default(int);
  17. }
  18.  
  19. //New way
  20. return person.ID ??? default(int);

In Visual Studio 2014 the operator '?..' did not receive renewal but maybe in next versions we'll see '????'  and even '?????' :-).