<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Mikael Söderström : .NET</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Skriv plugins till Internet Explorer med .NET</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/03/24/skriv-plugins-till-internet-explorer-med-net.aspx</link><pubDate>Tue, 24 Mar 2009 08:51:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6996084</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=6996084</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=6996084</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/03/24/skriv-plugins-till-internet-explorer-med-net.aspx#comments</comments><description>&lt;P&gt;Det finns ett nytt projekt på &lt;A title="MSDN Code Gallery" href="http://code.msdn.microsoft.com/" target=_blank mce_href="http://code.msdn.microsoft.com"&gt;MSDN Code Gallery&lt;/A&gt; som heter &lt;A href="http://code.msdn.microsoft.com/SpicIE" target=_blank mce_href="http://code.msdn.microsoft.com/SpicIE"&gt;SpicIE&lt;/A&gt; och som låter utvecklare enkelt skapa plugins till Internet Explorer i form av:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;IE browsing event handlers &lt;/LI&gt;
&lt;LI&gt;IE toolbar buttons &lt;/LI&gt;
&lt;LI&gt;IE menu entries &lt;/LI&gt;
&lt;LI&gt;IE context menu entries &lt;/LI&gt;
&lt;LI&gt;IE explorer bars &lt;/LI&gt;
&lt;LI&gt;IE toolbars&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Har inte hunnit testa det själv än, men det låter väldigt lockande då det tidigare har varit riktigt krångligt att skriva bra plugins (med metoder som &lt;A href="http://msdn.microsoft.com/en-us/library/aa752093(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa752093(VS.85).aspx"&gt;Navigate&lt;/A&gt; och &lt;A href="http://msdn.microsoft.com/en-us/library/aa752093(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa752093(VS.85).aspx"&gt;Navigate2&lt;/A&gt; vilka inte säger ett dugg om vad som egentligen sker).&lt;/P&gt;
&lt;P&gt;Du hittar projektet här:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://code.msdn.microsoft.com/SpicIE"&gt;http://code.msdn.microsoft.com/SpicIE&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Om du har testat det så kom gärna med kommentarer om vad du tycker om det!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6996084" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Internet+Explorer/default.aspx">Internet Explorer</category></item><item><title>Bokrecension – Build Your Own .NET Language and Compiler</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/10/01/bokrecension-build-your-own-net-language-and-compiler.aspx</link><pubDate>Wed, 01 Oct 2008 20:10:37 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6650539</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=6650539</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=6650539</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/10/01/bokrecension-build-your-own-net-language-and-compiler.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/compiler_2DDD1DCD.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="compiler" border="0" alt="compiler" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/compiler_thumb_25E80C1C.jpg" width="198" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Innehållsförteckning&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A Brief History of Compiler Technology&lt;/li&gt;    &lt;li&gt;A Brief Introduction to the .NET Framework&lt;/li&gt;    &lt;li&gt;A Compiler Flyover&lt;/li&gt;    &lt;li&gt;The Syntax for the QuickBasic Compiler&lt;/li&gt;    &lt;li&gt;The Lexical Analyzer for the QuickBasic Compiler&lt;/li&gt;    &lt;li&gt;QuickBasic Object Modeling&lt;/li&gt;    &lt;li&gt;The Parser and Code Generator for the QuickBasic Compiler&lt;/li&gt;    &lt;li&gt;Developing Assemblers and Interpreters&lt;/li&gt;    &lt;li&gt;Code Generation to the Common Language Runtime&lt;/li&gt;    &lt;li&gt;Implementing Business Rules&lt;/li&gt;    &lt;li&gt;Language Design: Some Notes&lt;/li&gt;    &lt;li&gt;Appendix A: quickBasicEngine Language Manual&lt;/li&gt;    &lt;li&gt;Appendix B: quickBasicEngine Reference Manual&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Har du någonsin funderat på hur man skriver ett eget språk med en kompilator för det? I &lt;a target="_blank" href="http://www.apress.com/book/view/9781590591345"&gt;Build Your Own .NET Language and Compiler&lt;/a&gt; av Edward G. Niles från &lt;a target="_blank" href="http://www.apress.com/"&gt;Apress&lt;/a&gt; får man en djupgående genomgång på hur man skriver en kompilator för QuickBasic med ren .NET-kod. En fullt fungerande kompilator följer även med! Boken börjar med att ta upp grundläggande om hur en kompilator fungerar och går sedan igenom de olika stegen där man skissar upp själva utséendet på språket med alla regler och visar sedan hur man med Reflection skriver en kompilator i Visual Basic .NET. Boken har inga exempel i C#, utan det är just Visual Basic .NET.&lt;/p&gt;  &lt;p&gt;Boken vänder sig till experter och är absolut ingenting för en nybörjare. Den är dock väldigt pedagogisk och förklarar de olika stegen väldigt noggrant, vilket gör att man hänger med lättare i det som händer. Alla exempel och program som används vid kontrollerna av modelleringen finns för nedladdning på &lt;a target="_blank" href="http://www.apress.com/"&gt;Apress&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Boken rekommenderas starkt till dig som är intresserad av att veta mer om hur man arbetar med kompilatorer, samt vill veta hur man bär sig åt för att skriva ett eget .NET-språk.&lt;/p&gt;  &lt;p&gt;Svårighetsgrad: &lt;strong&gt;Avancerad&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6650539" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Bokrecension/default.aspx">Bokrecension</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Visual+Basic+.NET/default.aspx">Visual Basic .NET</category></item><item><title>Snart kommer Microsoft "Oslo"!</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/09/18/snart-kommer-microsoft-quot-oslo-quot.aspx</link><pubDate>Thu, 18 Sep 2008 18:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6632893</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=6632893</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=6632893</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/09/18/snart-kommer-microsoft-quot-oslo-quot.aspx#comments</comments><description>&lt;P&gt;Om ungefär en månad under PDC 2008 så kommer Microsoft att visa upp deras nya satsning med kodnamnet "Oslo", samt dessutom släppa en CTP av SDK:n. För att förklara Oslo med en mening så är det en modelleringsplattform som underlättar arbetet med tjänsteorienterade applikationer. &lt;/P&gt;
&lt;P&gt;Det finns tre delar som kommer att kunna användas för att jobba med Oslo, ett visuellt verktyg för att arbeta med modeller, ett språk (har för tillfället kodnamnet "D") som komer att hjälpa till vid skapandet av DSL (Domain-Specific Languages) samt ett repository för att göra modellerna tillgängliga för det medföljande verktyget och även egenutvecklade komponenter. &lt;/P&gt;
&lt;P&gt;Repositoryt i Oslo är uppbyggt av System Center 5, Visual Studio 10 samt Biztalk Server 6. Annat som tas upp i samband med Oslo är Visual Studio 10 samt .NET Framework 4.0 med uppdaterade versioner av både Workflow Foundation samt Windows Communication Foundation för utveckling samt Biztalk Services för de olika tjänster. Har vi tur så kommer ett gäng härliga testversioner på PDC:n. :-) &lt;/P&gt;
&lt;P&gt;Det finns inte alltför mycket information tillgänglig i dagsläget, så det är mycket spekulationer runt om. Det sägs att språket "D" kommer att generera SQL, precis som Linq to SQL. Om de fungerar på samma sätt finns det dock inga bevis på. En fråga som dyker upp då är om det kanske är så att D i själva verket är en påbyggnad av Linq to SQL eller Linq to Entities? Kommer man att kunna använda detta för vanlig databashantering, eller enbart för att kunna arbeta med just "Oslo"? Det har även ryktats om att D skall bygga på XAML, vilket är intressant då det redan används i WPF, Silverlight och Workflow Foundation. &lt;/P&gt;
&lt;P&gt;Verktyget för Oslo kommer att ge en stor bild över hur allt runtomkring fungerar. Då Oslo har som huvuduppgift att underlätta arbetet med SOA så kommer det att ställas stora krav på att allt fungerar stabilt. Man kommer att genom verktyget kunna monitorera, följa olika processer med mera. För att underlätta arbetet mer så kommer man även att få med ett nytt designerverktyg för Workflow Foundation. &lt;/P&gt;
&lt;P&gt;Vad gäller systemkrav har jag fortfarande inte sett något, ej heller om det på något sätt kommer att finnas något utbyggt stöd för det i Windows Server 2008 R2/Windows Server 7 eller Windows Server 7. &lt;/P&gt;
&lt;P&gt;Det är väldigt svårt att föreställa sig exakt hur det kommer att se ut i arbetet med Oslo om man själv inte har tillgång till det, men något som är säkert är att årets PDC kommer att bli fruktansvärt intressant!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6632893" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/PDC/default.aspx">PDC</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/SOA/default.aspx">SOA</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Oslo/default.aspx">Oslo</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Visual+Studio+10/default.aspx">Visual Studio 10</category></item><item><title>Koppla ihop Windows CardSpace med ASP.NET Membership</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/09/09/koppla-ihop-windows-cardspace-med-asp-net-membership.aspx</link><pubDate>Tue, 09 Sep 2008 19:44:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6614021</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=6614021</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=6614021</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/09/09/koppla-ihop-windows-cardspace-med-asp-net-membership.aspx#comments</comments><description>&lt;p&gt;I samband med förra artikeln om Windows CardSpace så startade jag en tråd på &lt;a title="Aspsidan" target="_blank" href="http://www.aspsidan.se"&gt;Aspsidan&lt;/a&gt; för att kunna diskutera ämnet. En av kommenterarna som dök upp var av en person som hade börjat kika på hur han skulle implementera Windows CardSpace till sin befintliga ASP.NET-sida men sedan gett upp då det hade varit för krångligt. Det är nog ett väldigt vanligt problem, så därför tänkte jag visa hur det går till steg för steg.&lt;/p&gt;  &lt;p&gt;Det första vi behöver är förstås en ASP.NET-sida. Jag kommer att använda mig utav SqlMembershipProvider, men självklart är det möjligt att använda sig utav andra providers som bygger på ASP.NET Membership. Jag kommer sedan att använda Comment-fältet för användaren för att hantera kopplingen mellan InfoCards och ASP.NET-användare. I exemplet så kommer en användare bara kunna ha ett InfoCard per konto, men det bör finnas möjlighet att använda flera kort, för att göra det möjligt att logga in på flera platser. Precis som i förra artikeln så kommer jag att köra över ren HTTP för enkelhetens skull. Skall det användas på en publik hemsida så bör ni absolut använda HTTPS för att höja säkerheten mellan klient och server.&lt;/p&gt;  &lt;p&gt;De funktioner som kommer att finnas med är:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Möjlighet att koppla ett InfoCard till sitt ASP.NET Membership-kontot. &lt;/li&gt;    &lt;li&gt;Möjlighet att logga in med användarnamn och lösenord. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Det första vi gör är att skapa ett nytt Web Application Project och skapa upp en databas med standardtabellerna som används för ASP.NET Membership (de som skapas med aspnet_regsql.exe).&lt;/p&gt; &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;Vi kommer att spara ett värde som kallas PPID i användarens comment-fält Anledningen till att vi sparar det där nu är för att slippa skriva kod som inte är relevant för tillfället. Det skulle dock kunna sparas i till exempel en separat tabell i databasen för att göra det möjligt för användaren att koppla flera kort. PPID är ett ID som är unikt för kortet och “Relying Party” (kommer att förkortas RP framöver). Om samma kort används hos en annan RP så kommer ett annat PPID att användas. Helst bör man använda UniqueID, men hur det fungerar kommer jag att ta upp senare. PPID är det enda “Token” (bra svensk översättning på det, någon?) som användaren inte har möjlighet att påverka, till skillnad från till exempel namn, e-postadress, personnummer med mera.&lt;/p&gt;  &lt;p&gt;När vi använder ASP.NET Membership så skall användaren ha angivit en e-postadress, vilken vi kommer att anta är densamma som används i det InfoCard som kommer att skickas in. På så sätt kan vi enkelt plocka fram det eller de konton som innehåller e-postadressen och sedan se om något av dem har associerat kontot med ett PPID.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Det första vi skall göra nu är att skapa upp en sida med standardkontrollerna för att skapa en användare. Det gör vi genom att använda CreateUserWizard-kontrollen. Där skapar vi en användare som har samma e-postadress som vi har i något av våra InfoCards. När det är gjort och vi vet att vi kan logga in på sidan så är det dags att skapa upp sidan som tar hand om kopplingen mellan konto och InfoCard. Det första vi gör är att ta en modifierad version av formuläret som användes i introduktionsposten. Skillnaden mot det formuläret är att vi nu vill få tag i kortets PPID.&lt;/p&gt;  &lt;p&gt;Koden som vi använder i aspx-filen för att hämta in PPID och sedan koppla mot den inloggade användaren är som följande:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;application/x-informationcard&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xmlToken&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;tokenType&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:oasis:names:tc:SAML:1.0:assertion&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;requiredClaims&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnAssociate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Associate account&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;onclick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnAssociate_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Och när vi sedan skall koppla det mot användaren i btnAssociate_Click:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnAssociate_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    MembershipUser user = Membership.GetUser();&lt;/pre&gt;

  &lt;pre&gt;    user.Comment = GetPPID();&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Membership.UpdateUser(user);&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetPPID()&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    XmlDocument doc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;

  &lt;pre class="alt"&gt;    doc.LoadXml(Request.Form[&lt;span class="str"&gt;&amp;quot;xmlToken&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;

  &lt;pre&gt;    XmlNode node =&lt;/pre&gt;

  &lt;pre class="alt"&gt;        doc.SelectSingleNode(&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="str"&gt;&amp;quot;/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='privatepersonalidentifier']&amp;quot;&lt;/span&gt;, GetNamespaces(doc));&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; node.InnerText;&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; XmlNamespaceManager GetNamespaces(XmlDocument doc)&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    XmlNamespaceManager nsManager = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlNamespaceManager(doc.NameTable);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    nsManager.AddNamespace(&lt;span class="str"&gt;&amp;quot;saml&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;urn:oasis:names:tc:SAML:1.0:assertion&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; nsManager;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Nu har vår användare sparat undan sitt PPID. Det skall sedan användas för att identifiera användaren. Nästa steg är att hämta PPID samt e-postadressen från kortet för att användaren skall kunna identifieras. Vi skall använda ett likadant formulär som innan, med skillnaden att vi nu även skall hämta e-postadressen.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;application/x-informationcard&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xmlToken&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;tokenType&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:oasis:names:tc:SAML:1.0:assertion&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;requiredClaims&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnLogin&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Login&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnLogin_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det som sker när vi skickar in ett InfoCard nu är att vi skall hämta alla konton med e-postadressen och se om vi kan hitta något som är associerat med kortets PPID. Om vi hittar ett sådant så loggar vi in användaren.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnLogin_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    XmlDocument doc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;

  &lt;pre&gt;    doc.LoadXml(Request.Form[&lt;span class="str"&gt;&amp;quot;xmlToken&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; email = doc.SelectSingleNode(&lt;span class="str"&gt;&amp;quot;/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='emailaddress']&amp;quot;&lt;/span&gt;, GetNamespaces(doc)).InnerText;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; ppid = doc.SelectSingleNode(&lt;span class="str"&gt;&amp;quot;/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='privatepersonalidentifier']&amp;quot;&lt;/span&gt;, GetNamespaces(doc)).InnerText;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    MembershipUserCollection users = Membership.FindUsersByEmail(email);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (MembershipUser mu &lt;span class="kwrd"&gt;in&lt;/span&gt; users)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (mu.Comment != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; mu.Comment.Equals(ppid))&lt;/pre&gt;

  &lt;pre class="alt"&gt;            FormsAuthentication.RedirectFromLoginPage(mu.UserName, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Tack vare detta kan nu användaren logga in med det kopplade kontot utan att behöva ange varken användarnamn eller lösenord. Det gör att man kan ge användaren möjlighet att logga in på ett mycket säkrare sätt.&lt;/p&gt;

&lt;p&gt;Detta är endast en enkel inloggning där användaren kan koppla ett kort till sitt konto, men det skulle kunna byggas ut med till exempel:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Möjlighet att koppla flera kort till samma konto.&lt;/li&gt;

  &lt;li&gt;Möjlighet att skapa konton genom att skicka in ett InfoCard och sedan generera ett starkt lösenord.&lt;/li&gt;

  &lt;li&gt;Möjlighet att generera ett nytt lösenord genom att skicka in ett InfoCard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Det finns många möjligheter, och det är du själv som bestämmer vart du vill komma med din lösning.&lt;/p&gt;

&lt;p&gt;Precis som i förra artikeln så rekommenderar jag inte att man tar koden rakt av och använder i en skarp miljö, utan snarare har den i referenssyfte.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6614021" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Windows+CardSpace/default.aspx">Windows CardSpace</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/S_E400_kerhet/default.aspx">Säkerhet</category></item><item><title>Tip of the day: Set properties with reflection</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/14/tip-of-the-day-set-properties-with-reflection.aspx</link><pubDate>Mon, 14 Jan 2008 20:10:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5603106</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=5603106</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=5603106</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/14/tip-of-the-day-set-properties-with-reflection.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;If you use web sites instead of web application projects and load an user control dynamically, it can be hard to set the properties from code behind since you can´t cast the instance.&lt;/P&gt;
&lt;P mce_keep="true"&gt;What to do? WHAAAAT TO DOOOO???&amp;nbsp;Well, first of all, take a beer and chill. After that you can take a look at reflection, and especially PropertyInfo.SetValue(...).&lt;/P&gt;
&lt;P mce_keep="true"&gt;Magic:&amp;nbsp;&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; System.Reflection; &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; DoMagic()&lt;BR&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#2b91af size=2&gt;UserControl&lt;/FONT&gt;&lt;FONT size=2&gt; meLiek = LoadControl(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"tehcontrolz.ascx"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Type&lt;/FONT&gt;&lt;FONT size=2&gt; meLiekTehTajp = meLiek.GetType();&lt;BR&gt;PropertyInfo prop = meLiekTehTajp.GetProperty(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"waevvah"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;prop.SetValue(meLiek, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"lolz0rz"&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;ControlHolder.Controls.Add(meLiek);&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P mce_keep="true"&gt;More info:&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa330197(VS.71).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa330197(VS.71).aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa330197(VS.71).aspx&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5603106" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Tip+of+the+day/default.aspx">Tip of the day</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Get a free e-book from MS Press!</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/get-a-free-e-book-from-ms-press.aspx</link><pubDate>Wed, 02 Jan 2008 12:38:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5536017</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=5536017</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=5536017</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/get-a-free-e-book-from-ms-press.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;You can get a free e-book from MS Press here:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://csna01.libredigital.com/?urvs5cn3s8"&gt;http://csna01.libredigital.com/?urvs5cn3s8&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5536017" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Awesome/default.aspx">Awesome</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Linq/default.aspx">Linq</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+Ajax/default.aspx">ASP.NET Ajax</category></item><item><title>Posters</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/new-posters.aspx</link><pubDate>Wed, 02 Jan 2008 12:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4916692</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=4916692</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=4916692</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/new-posters.aspx#comments</comments><description>&lt;P&gt;Microsoft released some awesome&amp;nbsp;posters for a while ago:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET35_Namespaces_Poster_LORES.pdf" target=_blank mce_href="http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET35_Namespaces_Poster_LORES.pdf"&gt;Microsoft .NET Framework 3.5 - Commonly Used Types and Namespaces&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=771aeb45-9d27-4d1f-acd1-9b950637d64e&amp;amp;displaylang=en" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=771aeb45-9d27-4d1f-acd1-9b950637d64e&amp;amp;displaylang=en"&gt;2007 Office System Document: Developer Posters&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c2b9e44e-0bbd-47cb-bc09-b3d48be7f867&amp;amp;DisplayLang=en" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c2b9e44e-0bbd-47cb-bc09-b3d48be7f867&amp;amp;DisplayLang=en"&gt;Windows Server 2008 Component Posters&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4916692" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Office/default.aspx">Office</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category></item><item><title>Tip of the day: Double question mark</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/tip-of-the-day-double-question-mark.aspx</link><pubDate>Wed, 02 Jan 2008 12:14:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5535937</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=5535937</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=5535937</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/01/02/tip-of-the-day-double-question-mark.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;A not so common, but very usefull operator is the double question mark operator (??). This can be very usefull while working with nullable types.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Lets say you have two nullable int:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;int? numOne = null;&lt;BR&gt;int? numTwo = 23;&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Scenario: If numOne has a value, you want it, if not you want the value from numTwo, and if both are null you want the number ten (10).&lt;/P&gt;
&lt;P mce_keep="true"&gt;Old solution:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;if (numOne != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return numOne;&lt;BR&gt;if (numTwo != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return numTwo;&lt;BR&gt;&lt;BR&gt;return 10;&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;Or another solution with a single question mark:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;return (numOne != null ? numOne : (numTwo != null ? numTwo : 10));&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;But with the double question mark operator we can do this:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;return ((numOne ?? numTwo) ?? 10);&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;As you can see, the double question mark operator returns the first value that is not null. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5535937" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Tip+of+the+day/default.aspx">Tip of the day</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Visual Studio 2008 RTM</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2007/11/19/visual-studio-2008-rtm.aspx</link><pubDate>Mon, 19 Nov 2007 18:54:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5282838</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=5282838</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=5282838</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2007/11/19/visual-studio-2008-rtm.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Just found out that Visual Studio 2008 is released on MSDN!&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;More info at ScottGu's blog (as usual):&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5282838" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Awesome/default.aspx">Awesome</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item></channel></rss>