dinsdag 27 november 2007

Controleer in C# of je applicatie al draait

Om te controleren of er al een instantie van je C# applicatie draait kan je de Process collectie in de System.Diagnostics namespace controleren.
Hieronder de voorbeeld code:
/// 
/// Bepaal of een instantie van deze applicatie al draait
///

private static bool isPrevInstance()
{
try
{
//Bepaal de naam van het huidige proces
string currentProcessName = Process.GetCurrentProcess().ProcessName;
//Zoek naar de draaiende processen in dit systeem met deze naam
Process[] processesNamesCollection = Process.GetProcessesByName(currentProcessName);
//Bepaal of meer dan 1 proces draait
return (processesNamesCollection.Length > 1);
}
catch { }

return false;
}

maandag 19 november 2007

Verbergen van georven properties, methods of events van een klasse

Wanneer je een klasse in .Net erft, dan erf je ook automatsch alle properties, methods en events (members). Soms wil je dat een public member verborgen wordt voor de 'buitenwereld'. De IntelliSense zal de verborgen members dan niet in de lijst opnemen.
Het verbergen van zo'n member kan je op een aantal manieren doen:
  1. Verbergen in het properties venster van de designer.
    Hiervoor kan de attribuut System.Componentmodel.Browsable(bool browsable) gebruikt worden
  2. Verbergen voor IntelliSense.
    Hiervoor kan de attribuut System.Componentmodel.EditorBrowsable(EditorBrowsableState state) gebruikt worden
  3. Als Obsolete aanduiden, zodat de .Net compiler een waarschuwing of zelfs een foutmelding zal genereren.
    Hiervoor kan de attribuut System.Obsolete(string message, bool error) gebruikt worden

Bij veel members zijn de eerste twee attributen voldoende. De IntelliSense zal de members niet in de lijst opnemen, maar indien de member toch wordt aangeroepen zal de compiler de code nog wel accepteren.
Om de eerste twee attributen toe te kunnen passen dien je de member te overriden, bijv.:

public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}


Bij sommige members zijn de eerste twee attributen niet voldoende en kan je ervoor kiezen om het derde attribuut te gebruiken. Hierbij zal de IntelliSense de member gewoon opnemen in de lijst, maar wordt wel aangeduid als [deprecated]. Indien je de error parameter van dit attribuut de waarde true meegeeft, zal de code door de compiler niet geaccepteerd worden.
Om het laatste attribuut toe te kunnen passen dien je het keyword new te gebruiken, bijv.:
public new string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}

Bronnen:
Microsoft (System.Attribute derived classes)



vrijdag 16 november 2007

Tonen of verbergen van gebruikers op het Windows XP welkomstscherm

Het lijkt wel of gebruikersnamen willekeurig op het Windows XP welkomstscherm worden getoond (of juist niet worden getoond). De Administrator gebruiker wil je misschien wel op het welkomstscherm terug zien, terwijl dit meestal niet het geval is.

Gelukkig is het mogelijk dit te beïnvloeden door middel van de registry te wijzigen. Volg hiervoor de volgende stappen:

  1. Klik op Start en daarna Run (of Uitvoeren)
  2. Type de tekst "regedit" (zonder aanhalingstekens) in en klik op OK
    De registry Editor word opgestart
  3. Ga in de boomstructuur naar HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ SpecialAccounts \ UserList
  4. Voeg aan de rechterzijde een nieuwe waarde toe van het type DWORD
  5. Geef voor de naam van de nieuwe waarde de naam van de gebruiker op (bijvoorbeeld "Administrator")
  6. Geef de waarde 0 op als je een gebruiker NIET wil tonen op het welkomstscherm. Geef de waarde 1 op om de gebruiker WEL te tonen.
  7. Indien je wel wilt inloggen in Windows, terwijl de gebruiker niet op het welkomstscherm staat, dien je 2x CTRL-ALT-DEL te toetsen om een loginscherm te krijgen

donderdag 15 november 2007

Intressante informatie uit de StackTrace in .Net

Stack trace (ook wel stack backtrace of stack traceback genoemd) is een overzicht van actieve stack frames welke door een programma zijn uitgevoerd.
De StackTrace is bij de meeste .Net ontwikkelaars bekend als de extra debug informatie die het Exception object bevat.

De StackTrace is in .Net altijd op te vragen en kan (bijvoorbeeld ten behove van logging) handige informatie opleveren. Hiervoor kan het StackTrace object in de System.Diagnostics namespace gebruikt worden. Het nadeel van de informatie die je via de GetFrames() methode terugkrijgt, is dat dit veel te gedetailleerd is. Veel informatie over de interne calls binnen het .Net framework zelf, is hierin opgenomen. Om toch de relevante informatie uit de StackTrace te krijgen kan het controleren van de aanwezigheid van de FileName eigenschap van een StackFrame hulp bieden.
Hieronder de code die alleen deze relevante informatie uit de StackTrace haalt en in een string teruggeeft:

public static string GetStackTrace()
{
StringBuilder sb = new StringBuilder();
StackTrace stack = new StackTrace(true);

foreach (StackFrame frame in stack.GetFrames())
{
if (!string.IsNullOrEmpty(frame.GetFileName()))
sb.AppendFormat("{0}.{1} (line:{2} col:{3})\r\n",
frame.GetMethod().DeclaringType.FullName, frame.GetMethod().Name,
frame.GetFileLineNumber(), frame.GetFileColumnNumber());
}

return sb.ToString();
}



Bronnen:
WikiPedia
Microsoft