Sunday, May 25, 2025

Top Snippets & Add-Ons for C# Developers

 

📝 CommentsPlus

Purpose: Enhances the readability of your code comments by applying styles based on specific prefixes.

Features:

  • Italicizes standard comments.

  • Applies bold, color, or strikethrough styles to comments starting with special markers like //!, //?, //x, etc.

Download: CommentsPlus on Visual Studio Marketplace


🔍 C# Methods Code Snippets

Purpose: Provides a collection of reusable code snippets for common C# method patterns, enhancing coding efficiency.

Features:

  • Snippets for typical, virtual, static, and extension methods.

  • Quick insertion using shortcuts like method, vmethod, smethod, and xmethod.

Download: C# Snippets on Visual Studio Marketplace


🌈 Rainbow Braces

Purpose: Improves code readability by colorizing matching brace pairs, making it easier to identify code blocks.

Features:

  • Applies distinct colors to matching brackets, parentheses, and braces.

  • Supports both light and dark themes.

Download: Rainbow Braces on Visual Studio Marketplace


🎨 Solution Colors

Purpose: Helps differentiate between multiple open solutions by assigning unique colors to each.

  • Assigns custom colors to solutions or folders.

  • Displays colors in various parts of the Visual Studio interface for easy identification.

Download: Solution Colors on Visual Studio Marketplace


🧠 Visual Studio Spell Checker

Purpose: Ensures the accuracy of your code by checking the spelling in comments, strings, and plain text.

Features:

  • Real-time spell checking as you type.

  • Supports multiple languages and customizable dictionaries.

  • Can check entire solutions, projects, or selected items.

Download: Visual Studio Spell Checker on Visual Studio

Integrating these extensions into your Visual Studio setup can significantly enhance your coding efficiency and maintainability. Whether you're aiming for cleaner code, faster development, or better organization, these tools have got you covered. Happy coding! 🎉

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. }