woensdag 9 januari 2008

.Net applicatie starten vanaf netwerk

Wanneer je een .Net applicatie (of een .Net project in Visual Studio) wil starten vanaf een netwerkschijf, dan kan je de volgende foutmelding krijgen:
Request for the permission of type 'System.Security.Permissions.EnvironmentPermission...' failed

In Visual Studio krijg je tijdens het debuggen een foutmelding zoals deze te zien:


Het .Net framework staat standaard niet toe dat applicaties gestart worden vanaf het netwerk. Via het Configuratiescherm kan geregeld worden dat .Net dit wel accepteert. Voer hiervoor de volgende stappen uit:
  1. Start "Microsoft .NET Framework 1.1 (of 2.0) Configuration" in Systeembeheer (of Administrative Tools) in het Configuratiescherm

  2. Ga naar My Computer / Runtime Security Policy / Machine / Code Groups / All_Code

  3. Klik in het rechter deel van het scherm op "Add a Child Code Group"

  4. Vul de naam voor de Code Group in (bijv. "Trust L drive") en klik op Next

  5. Specificeer URL als Condition Type en vul de URL naar de netwerk drive in (voor drive L is dit "file://L:/*") en klik op Next


  6. Selecteer voor de Permission Set de set "FullTrust" en klik op Next en daarna Finish

In dit voorbeeld is de netwerk drive L nu 'getrust' door het .Net framework en kunnen .Net applicaties uitgevoerd worden vanaf deze drive.

Indien je geen snelkoppeling naar "Microsoft .NET Framework 1.1 (of 2.0) Configuration" in Systeembeheer (of Administrative Tools) in het Configuratiescherm hebt, dan kan je ook gebruik maken van de command line tool CasPol.exe. Om hetzelfde als hierboven te bereiken dien je het volgende commando uit te voeren:
CasPol.exe -m -ag 1 -url file://L:/* FullTrust -n "Trust L drive"

Succes ermee !!

donderdag 6 december 2007

Foutmelding: Client does not support authentication protocol requested by server; consider upgrading MySQL client

Vaak krijg ik na een nieuwe installatie van een MySQL server de volgende foutmelding bij het verbinden met de MySQL service vanuit .Net:
Client does not support authentication protocol requested by server; consider upgrading MySQL client

De oplossing voor dit probleem kan één van de onderstaande zijn:

  1. De laatste versie van MyODBC installeren
  2. Vervang het wachtwoord, van de gebruiker waarmee verbonden wordt met de MySQL database, met de oude implemetatie van het wachtwoord. Hieronder een voorbeeld van het SQL statement om dit wachtwoord aan te passen:
    SET PASSWORD FOR 'root'@'localhost' = OLD_PASSWORD('password');
    - vervang 'root' door de MySQL gebruikersnaam
    - vervang 'password' door het wachtwoord van deze gebruiker

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

vrijdag 19 oktober 2007

Converteer afbeeldingen naar grijswaarden in .Net 2.0

Wanneer je in .Net afbeeldingen wil converteren naar grijswaarden, moet je GDI+ gebruiken. GDI (Graphics Device Interface) is hét component in het .Net framework wat gebruikt kan worden voor image processing.

Hieronder de code om afbeeldingen met behulp van GDI om te zetten naar afbeeldingen in grijswaarden:
public static Bitmap ConvertToGrayscale(Bitmap source, Color transparencyColor)
{
Bitmap bm = new Bitmap(source.Width, source.Height);
for (int y = 0; y < bm.Height; y++)
{
for (int x = 0; x < bm.Width; x++)
{
Color c = source.GetPixel(x, y);
int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
}
}
if (transparencyColor!=Color.Empty)
bm.MakeTransparent(transparencyColor);
return bm;
}
public static Bitmap ConvertToGrayscale(Bitmap source)
{
return ConvertToGrayscale(source, Color.Empty);
}

De optionele parameter transparencyColor wordt gebruikt om deze kleur in de afbeelding te converteren naar Transparant!
Het grote nadeel van GDI+ is, is dat het niet erg snel is, omdat GDI+ nog niet voldoende gebruikt maakt van hardware acceleratie.

Een goed alternatief in het .Net 2.0 framework is de statische methode CreateDisabledImage in the ToolStripRenderer klasse. Deze methode heeft mij geholpen een groot aantal afbeeldingen in een User-Interface te converteren naar afbeeldingen in grijswaarden, met een hoge performance. Deze methode roep je als volgt aan:
public static Image CreateDisabledImage (
Image normalImage
)

Deze klasse is onderdeel van de System.Windows.Forms namespace. Je moet dus wel een reference naar deze assembly aan je project toevoegen.

Bronnen:
Wikipedia
Microsoft MSDN
Bob Powel (GDI guru)