PerSalmi.NET

Swedish .Net software developer...
# Wednesday den 22 May 2013

Vi har brottats med dåliga prestanda i Visual Studios debugger under flera år i ett projekt jag arbetar med. Det handlar om att single-step debugging i riktigt stora solutions, här pratar vi om 120+ projekt i en solution, går segt och tär rejält på tålamodet. Flera sekunders fördröjning för varje steg man tar med step-into eller step-over när man sitter och letar efter fel är inte ovanligt trots mycket enkla operationer i varje steg.

Men alldeles nyss gjorde min projektkollega, Henrik Cooke, ett fenomenalt genombrott i frågan! Debuggingen blir riktigt rapp och responsiv om man stänger av Edit and Continue funktionen i Visual Studio debuggern.

Så om du inte använder eller i alla fall kan leva utan Edit and Continue stöd när du kodar och felsöker så gör så här:

  • Gå till menyn DEBUG -> Options and Settings…
  • Öppna fliken Debugging -> Edit and Continue
  • Se till att rutan Enable Edit and Continue är urkryssad och välj OK

Det ska se ut så här:

image

Steg-operationerna i debuggern flyger fram efter att man fixat detta!

Wednesday, May 22, 2013 1:56:54 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
.Net | Verktyg | Visual Studio
# Saturday den 20 February 2010

Kodkontrakt är en ny teknik som kommer i samband med Visual Studio 2010. Vad är då detta med konkontrakt? Lite förenklat kan man väl säga att det är ett sätt att kunna skriva kod som kontrollerar att inkommande och utgående parametrar och resultat är rimliga och håller sig inom förväntade gränser. Kan alltså vara riktigt bra för att se till att den som använder dina klassbibliotek inte skickar in dåliga parametervärden och ställler till det för sig.

Kodkontrakt har varit i fokus och diskuterats i min närhet vid flera tillfällen de senaste månaderna, dels vid ett frukostseminarie  i december och senare när jag själv presenterade nyheter kring .NET 4 på en konferens i Sälen för några veckor sedan. Först var vi lite besvikna eftersom det verkade som kodkontrakten inte skulle fungera ihop med Visual Studio 2010, de fanns inte med i installationen. Vi hörde rykten om att teamet på Microsoft Research inte hade levererat till Visual Studios byggteam, så kontrakten kom att saknas i betaversion 2.

imageEn del extra efterforskningar efter frukostseminariet visade dock att kontraktstödet faktiskt finns och fungerar, det kräver bara en liten extra nerladding och en separat installation. Både vi som lyssnade och killen som höll frukostföredraget var alltså besvikna i onödan. Det visade sig dessutom fungera bra med Visual Studio 2010 Beta 2 samt nu med den nya RC-versionen.

Det man behöver är antingen Code Contracts Standard eller Premium som finns att ladda ner från Code Contracts på Microsoft DevLabs. Teamet bakom kodkontrakten har mer material i form av publicerade forskningsrapporter och användarhandledning i PDF-form på sin sajt hos Microsoft Research, läs dem här: Contracts - Microsoft Research. Om man vill delta i diskussioner eller ställa frågor finns även ett forum specifikt om kodkontrakt på: Code Contracts MSDN Forum

Ok, det var lite allmän info. Hur kommer man då igång att använda kontrakt i sin dagliga kodning?

Efter att man installerat kontraktstödet så får man en ny panel i projektegenskaperna, Code Contracts:

image

Ovan ser man att jag aktiverat både runtime-kontroller och statiska kontroller som körs vid kompilering. På min labbmaskin har jag installerat premiumvarianten av kontraktstödet, därav har jag både runtime och statisk kontroll. Det är alltså denna projektinställning som behövs för att kontrakt som skrivits in i koden ska vara aktiva och kontrolleras antingen vid körning eller kompilering.

För att visa hur kontrakt för före- och eftervillkor fungerar har jag en mycket enkel metod i mitt C# projekt:

public int PositiveAdd(int a, int b) 
{
    Contract.Requires(a >= 0);
    Contract.Requires(b >= 0);
    Contract.Requires((a + b) > 0);
    Contract.Ensures(Contract.Result<int>() == (a + b));
    return (a + b);
}

Villkoren ovan är avsedda att kontrollera att båda inparametrarna är större än noll och att de tillsammans också ska vara större än noll. Kontrollen av slutresultatet verifierar att returvärdet är ett heltal som är summan av inparametrarna. Detta är ju som ni ser extremt förenklat bara för att visa just själva kontrakten. Requires-raderna ger alltså de “före”-villkor vi vill ha medan Ensures ger oss “efter”-kontroller.

Om man kör kod som utrustats med kontrakt för före- och eftervillkor i sin debugger kan man tydligt se att Contract.Requires(…) och Contract.Ensures(…) inte är kodrader som exekveras som vanligt. I denna sekvens av bilder från en debugger session visar det sig hur kontrakten kontrolleras vid exekvering av metoden.

Vi börjar med att först köra alla sk pre-conditions för att kontrollera utgångsläget när metodens kod påbörjas:

CropperCapture[4]

CropperCapture[5]

CropperCapture[6]

Nästa steg är mer överraskande, det är här man verkligen ser att Contract raderna inte är en vanlig del av metoden, debuggern visar nu att metodens kod kommer att exekvera från början av metodens kodblock:

CropperCapture[7]

Här fortsätter sedan körningen med att utföra det verkliga jobbet i vår metod:

CropperCapture[8]

Den funktionella delen av metoden är nu klar, i normala fall är vi nu färdiga att returnera resultatet till den anropande kodsekvensen:

CropperCapture[9]

Men eftersom kontrakten är aktiverade så är det istället dags att gå igenom och verifiera alla “efter”-villkor:

CropperCapture[10]

Som sammanfattning är alltså Contract-raderna inte en del av metoden som körs procedurellt!

Detta var kontroller för enkla före- och eftervillkor, kontraktstödet innehåller fler varianter av kontroller, men de får vi ta upp en annan gång.

Saturday, February 20, 2010 12:14:08 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | Visual Studio
# Wednesday den 29 April 2009

Felsökte en ASP.NET applikation som har sitt ursprung i version  1.1 av .NET Framework idag för att utreda varför en nybyggd funktion som bygger på ASP.NET Ajax med UpdatePanels inte fungerade.

Problemets symptom var att UpdatePanelen alltid gav en total omladdning av sidan, inga events lyckades få panelen att göra en partiell uppdatering. Ett inte helt ovanligt problem om man googlar lite på problem i samband med UpdatePanel.

Boven i dramat då? Jo, eftersom det handlar om ett webbprojekt som uppdaterats från äldre ASP.NET till 3.5 så har web.config fått en automatisk sättning av XHtml kompatibilitet som inte funkar bra ihop med ASP.NET Ajax.

Se till att du kontollerar att xhtmlConformance är satt till något annat än “Legacy”, använd tex “Transitional” eller “Strict”.

image

Wednesday, April 29, 2009 4:03:32 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
.Net | ASP.NET | Webb
# Thursday den 19 March 2009

imageEtt tips till den som ska vidareutveckla eller underhålla C# applikationer som bygger på Linq To Sql modeller!

Ta en titt på https://www.huagati.com/dbmltools/, det är en plugin till Visual Studio 2008 som ger bra möjligheter att fixa vanliga underhållsuppgifter i .dbml filer.

Exempel på vad man kan åstadkomma snabbt och enkelt utan att generera om hela modellen med SQLMetal eller behöva ta till utvägen med ta-bort-och-lägg-till-igen-och-gör-om-alla-mappningar i O/R Designern är:

  • Lägga till klasser för nya tabeller/vyer
  • Uppdatera namn på kolumner
  • Byte av typer på kolumner
  • Använda regler för att snygga till namnen på klasser och properties i modellen automatiskt

Ändringarna som pluginen gör är inte raketforskning när man analyserar dem, det går mycket väl att använda samma teknik som man använder vid handskrivna entitetsklasser, men det är väldigt smidigt att kunna göra ändringarna med ett verktyg.

Thursday, March 19, 2009 3:22:06 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Entity Framework | Linq | Visual Studio
# Tuesday den 17 March 2009

Varför är det så att en del problem dyker upp igen och igen när man sitter och utvecklar och varje gång man letar efter lösningen känner man igen sig väldigt väl… lite för väl? Till sist slutar det med att man kommer på vad det är och inser att detta har jag bråkat med förrut, fått frågor om och till och med hjälpt andra med flera gånger under de senaste åren. Ja, det är väl just detta kriterie som gör att en fråga hamnar på en FAQ lista och ställs gång efter gång.

Hur var det nu med COM Interop då? Jo, just detta teknikområde tycks rymma oändliga möjligheter att glömma nån liten detalj och sedan sitter man och felsöker och timmarna bara rusar iväg.

image Dagens scenario var en .NET assembly med några interface som skulle anropas från en native-klient på en testmaskin med en nära nog produktionsmässig installation av operativsystem och verktyg. Det är nästan lustigt hur felsökningen långsamt letar sig fram till en lösning. Först testas det på en utvecklarmaskin, där det förstås fungerar. Sedan börjar någon gå på spåret att det kan vara rättigheter som saknas, nähä, inte det heller. Är det verkligen rätt fil vi installerar, det är ju mer än en gång man trott det men haft fel… Man tänker så det knakar, pratar med fler kollegor, börjar gräva i registryt… Skumt, inget spår av den aktuella GUID som borde finnas där. Men vi har ju gjort registreringen av komponenten om och om igen, fram och tillbaks. Nåväl, efter lång felsökning och en god portion frustration, tankar kring att implementera en annan lösning utan COM och lite andra mindre framgångsrika försök hittades felet och avhjälptes under stort jubel. Projektkollegan som hade spenderat mest tid med felsökningen tyckte att lösningen borde vi nog skriva upp och rama in för framtiden. Vi får se om en bloggpost kan vara jämförbart med en inramning.

En .NET assembly som innehåller ett COM gränssnitt och ska bli åtkomlig från COM klienter ska genomgå följande steg för att man ska undvika frustration:

  • Registrera .NET assemblyn för att COM-runtime systemet ska kunna lokalisera den
  • Generera ett COM Type Library för att klienten ska kunna interagera med de publika typer som finns i assemblyn
  • Driftsätta assemblyn antingen i samma katalog som klienten eller i Global Assembly Cache 

Verktyget för att göra detta är RegAsm. Syntaxen är som följer:

Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.3074
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.

Syntax: RegAsm AssemblyName [Options]
Options:
    /unregister          Unregister types
   
/tlb[:FileName]      Export the assembly to the specified type library and register it
    /regfile[:FileName]  Generate a reg file with the specified name instead of registering the types. This option cannot be used with the /u or /tlb options
    /codebase            Set the code base in the registry
    /registered          Only refer to already registered type libraries
    /asmpath:Directory   Look for assembly references here
    /nologo              Prevents RegAsm from displaying logo
    /silent              Silent mode. Prevents displaying of success messages
    /verbose             Displays extra information
    /? or /help          Display this usage message

Hade vi inte använt RegAsm då? Jodå, men den lilla väsentliga parametern /tlb hade fallit bort.
Enklaste fallet att registrera och generera rätt Type Library blir så här:

C:\dotnet>RegAsm MyNETAssembly.dll /tlb

Observera att verktyget TlbExp också finns tillgängligt men det skapar enbart type library filen utan att göra korrekt registrering av den. Så RegAsm är trevligare.

Nu återstår att se hur länge det tar att felsöka nästa gång det händer… Men “lagen om att det inte får gå för lätt” kommer väl nu att slå in och se till att det blir ett annat problem vi får leta efter nästa gång.

Tuesday, March 17, 2009 9:23:32 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [2]
.Net | COM
# Saturday den 14 March 2009

image Gänget bakom MSDN Managed Newsgroup Support har startat upp ett projekt för att bygga upp en Visual Studio Solution med kodexempel för C#, VB och C++. Nu är det ju inte unikt att det publiceras exempelkod, men att ha en enda källa som tar ett samlat grepp på ett antal grundläggande teknikområden och låter de ingående exempelprojekten samspela och kombineras i alla tänkbara varianter känns fräscht. Det är ofta man hittar exempel som går i en riktning tex interop från C# klient till C++ server medan det man egentligen letar efter är det omvända. Här vrider man och vänder på de flesta kombinationer!

Anledningen att jag fastnade för projektet direkt jag såg det är att vi under ganska lång tid jobbat med ett brownfield (C++) system där olika delar bytts ut och strukturerats om och därmed har nya delar gjorts i managedkod (C#), jag tror knappt det är någon variant av interop som inte varit inblandad i det hela. Hade detta funnits och våra google-master-skills hade låtit oss hitta det förra sommaren så hade det varit perfekt.

I dagsläget finns följande tekniker med i projektet:

  • COM & ActiveX
  • Dataaccess
  • Office-anpassning
  • Klassbibliotek
  • RPC & IPC

Kolla in All-In-One Code Framework på CodePlex. Förhoppningsvis kommer det att växa med massor av exempel, tekniker och kombinationer ganska snart. Förresten, det vore inte dumt att blanda in Windows Mobile i leken också för att öka på antalet möjliga kombinationer i de fall det är teknik som är tillämpbar på telefoner och handenheter.

Saturday, March 14, 2009 12:57:07 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | C++ | VB | Visual Studio
# Monday den 3 November 2008

ef2I Entity Framework gruppen har man funderat kring användning av data access och att användare av data har olika profiler. Sedan har man kollat vad som kan göras för att underlätta livet tillsammans med EF för de olika användartyperna. Tidsramen för de här ändringarna är .NET Framework 4.0.

Agilekillen
Typisk i ALT.NET rörelsen, här är konkurrenten tekniskt sett NHibernate. Från den här gruppen har man tagit till sig massor av feedback. Det har ju kommit en hel del hårda omdömen om EF från ALT.NET-håll, kanske mest beroende på att många investerat tungt i kompetens på NHibernate och nu riskerar att förlora mark när det finns en liknande teknik från Microsoft, men det har även varit konstruktiv kritik. Resultatet är att man kommer att kunna använda en “enbart-kod-variant” och låta EF skapa lagringen.

Den modellbaserade utvecklaren
Här är modell-först en ny variant att använda för att utifrån en modell skapa databasstrukturen. Man har också ett round-trip-stöd för att uppdatera modellen baserat på databasändringar. Templatemotorn T4 används här tillsammans med workflow och ger en kodgenererande funktion som ska kunna återanvändas.

Ramverksutvecklaren
Här kom det krav på att lazy-loading skulle vara en valfri möjlighet, vilket det kommer att bli. Ytterligare ett tillägg är tabellvärda funktioner. Även funktioner som definieras i modellen finns att tillgå, sk EdmFunctions. Dessa definieras i EDM modellens XML beskrivning.

LINQ ses som ett sätt att hämta objekt från databasen. Men om vi man inte vill ha objekt? Med hjälp av ExecuteQuery på ett data context kan man få ut en DataReader för att direkt få “rader” när man inte bryr sig om objektstruktur!

Detta kommer nog att kräva lite med utforskande labbar för att sjunka in.

Dagens citat: “ADO.NET Data Services (Astoria) – the Red Bull of data access”  - den ger dig vingar…

Monday, November 3, 2008 7:25:23 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | PDC 2008
# Monday den 17 March 2008

Frågan dök upp under dagens kurstillfälle när vi presenterade TDD i Visual Studio Team Suite. Svaret är: Ja, det finns grejer som inte kostar något, bland andra PartCover och CLR Profiler. Det är kanske lite jobbigare att använda än de kommersiella verktygen men betydligt billigare och därmed tillgängligt även för mindre utvecklingsteam som kanske inte har så stor budget.

Monday, March 17, 2008 11:01:02 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Visual Studio
# Tuesday den 20 November 2007
Framåt kvällen igår när jag satt och pratade med några kollegor efter månadens konsultmöte så frågade min kollega Mats om jag hade hört något närmare när Visual Studio 2008 skulle släppas i RTM version. Jag gjorde en något humoristiskt menad ansats att titta på klockan... Inte för att jag hade en aning om det just i det ögonblicket men det verkar inte ha varit helt galet att försöka uppskatta Visual Studio 2008 nedkomsten genom att kolla klockan istället för att ge sig på almanackan. Nerladdningen pågår för fullt just nu.

VS2008 download screenshot

Om ett par timmar är det väl läge att kolla hur det står till med de sista ändringarna sedan senaste beta-versionen och titta till statusen för en del plugin-moduler man kan komma att behöva.
Tuesday, November 20, 2007 10:01:05 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Visual Studio
# Friday den 27 July 2007

Det gick relativt snabbt att tanka ner VS 2008 och dess tillhörande MSDN Library igår, mycket snabbare än de tidigare CTP releaserna av Orcas. Jag antar att Microsoft lagt lite mer resurser på bra distribution av nya betaversionen än de gjort tidigare med tanke på att det troligen blir ganska hårt tryck på nerladdningen av denna release som sägs vara funktionsmässigt komplett.

Installationen på min Vista laptop (Dell Latitude D820) gick på ca 1,5 timme, jag körde med Virtual Clone Drive direkt från en ISO image på samma hårddisk så det kanske inte var optimalt ur prestandahänseende.

VS2008 Beta 2  install 1

Installationen gick igenom helt utan problem och några få minuters test visade att det går utmärkt att skapa och bygga både Winforms och ASP.NET applikationer. Det blir intressant att se hur väl den hanterar att bygga applikationer med olika målplattformar i fråga om .NET versioner. Jag ska ge den ett rejält test med en större webbapplikation för att se om det fungerar bra att bygga ASP.NET 2.0 applikationer som driftas på servrar utan .NET Framework 3.5.

Friday, July 27, 2007 5:32:48 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
.Net | ASP.NET | Visual Studio
# Monday den 14 March 2005

Veckans anledning till att man helt i onödan har stångat pannan blodig är "PRB: Some Functionalities of a COM+ Application Do Not Change If You Change the Corresponding Settings in the COM+ Catalog". Råkat ut för "COM+ activation not completed within the time..." och trott att det räcker med att peta upp CreationTimeout i administrationsverktyget för komponenttjänster?

Slutsatsen är att det inte räcker med det, momenten som behövs är:

  • Kompilera om den aktuella assembly filen
  • Registrera den med gacutil /i
  • Registrera COM+ applikationen med regsvcs

CreationTimeout i COM+ katalogens egenskaper för komponenten är alltså en återvändsgränd.

Monday, March 14, 2005 3:31:55 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net
Blog & Contact
Per Salmi
Per Salmi
Min LinkedIn Profil

Jag arbetar på Combitech AB i Linköping med konsultuppdrag och utbildning inom Microsoft .NET området. Kontakta mig gärna om ni har frågor, behov av konsulttjänster eller är intresserade av utbildning inom .NET.

Copyright © 2019 Per Salmi

Bloggmotor: newtelligence dasBlog 2.3.12105.0

Sign In
Statistics
Total Posts: 73
This Year: 0
This Month: 0
This Week: 0
Comments: 0

Datorer
All Content Copyright © 2019, Per Salmi