Nogle gange kan man være heldig at finde lidt skjult guld gemt i andre blogindlæg.

 I et indlæg om XML i VB.Net forklarer Jim O’Neil hvordan man kan installere et lille addin til Visual Studio, der gør det muligt at indsætte XML fra udklipsholderen til VS som C# kode. Addin'et findes som eksemplet "LinqSamples/PasteXmlAsLinq" i C:\Programmer\Microsoft Visual Studio 9.0\Samples\1033\CSharpSamples.zip, og skal blot kompileres og flyttes til mappen C:\Documents and Settings\[brugernavn]\Dokumenter\Visual Studio 2008\Addins

Dermed bliver et fragment fra det klassiske books.xml eksempel:

    1    <book id="bk110">

    2       <author>O'Brien, Tim</author>

    3       <title>Microsoft .NET: The Programming Bible</title>

    4       <genre>Computer</genre>

    5       <price>36.95</price>

    6       <publish_date>2000-12-09</publish_date>

    7       <description>Microsoft's .NET initiative is explored in

    8       detail in this deep programmer's reference.</description>

    9    </book>

Konverteret til:

    1 XElement xml = new XElement("book",

    2     new XAttribute("id", "bk110"),

    3     new XElement("author", "O'Brien, Tim"),

    4     new XElement("title", "Microsoft .NET: The Programming Bible"),

    5     new XElement("genre", "Computer"),

    6     new XElement("price", "36.95"),

    7     new XElement("publish_date", "2000-12-09"),

    8     new XElement("description",

    9         "Microsoft's .NET initiative is explored in \n" +

   10         "      detail in this deep programmer's reference."

   11     )

   12 );

 

Når det indsættes via menuen Edit -> "Paste XML as XElement", der er synlig, når udklipsholderen indeholder XML. Praktisk Smile

UPDATE: I stand corrected.  Belært af Mark og Rasmus (se kommentarer nedenfor) har jeg opdateret mit kodeeksempel med nyeste Rhino Mocks funktionalitet.  Tak for det.

Jeg ser flere og flere referencer til AAA på nettet (se f.eks. RasmusKL og Roy Osherove).  Jeg har indtil nu været ganske tilfreds med Record/Playback metoden for Rhino Mocks, men jeg kan sagtens se pointen bag AAA-stilen, så det er tid til at skifte vane.

Jeg har indtil fornylig brugt Rhino Mocks v3.4.  Det viser sig, at der lidt udfordringer i at følge AAA med den måde, Rhino Mocks 3.4 fungerer.  Problemet ligger i måden, man sætter expectations op.

Antag vi har følgende interface ITest, som vi ønsker at mocke:

public interface ITest
{
    int DoStuff(int a);
}

 

Vi kan sætte expectations op på følgende måde:

ITest testMock = mocks.CreateMock<ITest>();
Expect.Call(testMock.DoStuff(11)).Return(42);

Expectations bør ligge i Arrange-blokken, men vi forventer, at DoStuff bliver kaldt med værdien 11, hvilket faktisk er en Assert.  Ønsker man at sætte yderliger constraints op på parametre, skal det også ske i Record fasen, som hører under Arrange-blokken, men constraints bør ligge i Assert-blokken.

Rhino mocks v3.5 giver en helt ny API, som gør, at vi nu kan skrive vores test på en helt anden måde (tak til Rasmus):

// Arrange
ITest testMock = MockRepository.GenerateStub<ITest>();
testMock.Stub(x =>; x.DoStuff(Arg<int>.Is.Anything)).Return(42);

// Act
testMock.DoStuff(11);

// Assert
testMock.AssertWasCalled(x => x.DoStuff(Arg.Is(11)));

Testen er nu delt op i de tre AAA-blokke som ønsket.

De fleste som har programmeret Windows applikationer med et brugerinterface ved, at man ikke kan tilgå vinduer fra andre tråde end den tråd, der har oprettet vinduet, og som står for at pumpe beskedkøen til vinduet.

I klassisk Win32 er det ganske simpelt at overholde denne regel, da man med PostMessage nemt kan placere en besked i et vindues beskedkø, selvom man kalder fra en anden tråd.  PostMessage returnerer øjeblikkeligt.  SendMessage er en lidt anden historie.  Såvidt jeg husker, bør man ikke kalde den fra en anden tråd, da man kan risikere, at man bliver blokeret i længere tid indtil tråden, der ejer vinduet, vågner op og får pumpet nogle beskeder.  Hvis SendMessage kaldes fra den ejende tråd, bliver Windows proceduren kaldt direkte, hvilket effektivt svarer til at placere en besked forrest i beskedkøen og pumpe med det samme.

I .NET og WinForms benyttes Control.InvokeRequired, Control.Invoke og Control.BeginInvoke.

Jeg har altid tænkt på Control.Invoke som svarende til SendMessage og Control.BeginInvoke som svarende til PostMessage.  I praksis passer det også meget godt, men det er ikke helt det samme der sker.  Faktisk bliver PostMessage kaldt af både Invoke og BeginInvoke.

Når man benytter Invoke og BeginInvoke, registrerer WinForms en ny besked i Windows og benytter PostMessage til at anbringe beskeden i beskedkøen for vinduet (i Win32 er der i princippet ingen forskel på kontroller og vinduer – alt er vinduer).  Forskellen på Invoke og BeginInvoke er, at Invoke venter indtil vinduets beskedkø har behandlet beskeden, mens BeginInvoke returnerer med det samme.

Resultatet er, at der for Invoke godt kan gå længere tid, inden funktionen returnerer, hvis der allerede ligger en milliard beskeder i køen, eller vinduet af den ene eller anden grund ikke lige pumper beskedkøen. 

Medmindre man virkelig har brug for at vente, vil BeginInvoke derfor være at foretrække.

Denne sommer bliver fyldt med 5 nye episoder af klassikeren Monkey Island med titlen Tales of Monkey Island.

Disse episoder skal ikke forveksles med The Secret of Monkey Island Special Edition som er et remake af det første Monkey Island spil til bl.a. Xbox Arcade. Det bliver helt nye eventyr for Guybrush Threepwood og kommer til PC og Wii som downloads i løbet af sommeren. De bliver skabt af en gruppe af tidligere Lucas Arts medarbejdere, dog ikke Ron Gilbert som kører sit eget projekt som beskrives som Monkey Island meets Diablo.

Jeg glæder mig ihvertfald til at få lidt gang i adventure genren igen og hvorfor ikke starte med kongen?