Welcome to MSDN Blogs Sign in | Join | Help

Henrik W H

ISV Developer Evangelist
<Code is poetry/>

Mødebooking med VSTO, WPF og ClickOnce

Jeg har gennem det sidste stykke tid haft et skuffeprojekt at ligge som jeg har kodet lidt på, når tiden har været til det. I gamle dage, i Office 2003 tiden, havde Ole Kjeldsen lavet et værktøj til at booke mødelokaler her i Hellerup. Værktøjet var ikke kompatibelt med Office 2007. Jeg samlede jeg bolden op, og har implementeret det på ny, med nye teknologier (det var lavet i VBA). Jeg har nu en produktionsklar (sagt af en udvikler) version. Jeg vil tro at jeg har brugt knap 1 uge på selve funktionaliteten omkring mødebooking. Men så har jeg tilgengæld brugt godt en uge på WPF, templates, databinding og threading i VSTO.

Det har resulteret i en Outlook 2007 Add-in. 

image

Applikationen viser to tabs, en for hver etage. På hver tab er der et billede af grundplanen. På grundplanen er alle mødelokalerne placeret, og er illusteret med de grønne, røde, gule og grå cirkler. Der kan trykkes på de grønne mødelokaler. Ved et tryk tilføjes mødelokalet til den åbne Appointment, og du kan nu med almindelig outlook funktionalitet sende mødeindkaldelsen ud og dermed få booket mødetlokalet. I højre side vises blogs fra afdelingen, samt status for det valgte mødelokale.

Umiddelbart var der flere ting som jeg gerne ville opnå med dette add-in:

1) Selvfølgelig at det skal være nemt at finde frie mødelokaler. Vi har 42 i Hellerup, og det tager minimum 15 sekunder at åbne et mødelokale i outlook gennem "File->Open->Other User's Folder". Ofte skal man igennem temmelig mange mødelokalekalendere før man finder et ledigt mødelokale. Træls og langsommeligt.

2) Lave lidt intern "markedsføring" af afdelingen, Developer Platform & Evangelism. Hvis du vil booke et møde med toolet, så bliver du eksponeret for vores blogs. Det skulle gerne skabe noget intern synlighed på hvad sådan nogle evangelister også render rundt og laver :-)

3) og sidst men ikke mindst. Jeg trængte til at lave noget andet end Hello World ;-)

VSTO 3.0
Reelt set, så er det ikke ret meget VSTO der i denne add-in. Jeg har tilføjet en "Outlook Form Region", og gennem Wizard'en bedt om en "Separate" form. På den vis, får jeg en knap i menuen, som åbner min form. I samme Wizard har jeg valgt at min Form Region kun skal vises ved IPM.Appointment. Så er formen egentlig bundet op og jeg kan begynde lave min Winform. 

Jeg startede ud med at forsøge mig med WinForms. Efter at have brugt lidt tid på at finde ud af at lave "Image Maps" ovenpå en PictureBox for at få mappet mødelokaleknapperne ind, besluttede jeg at lave en WPF usercontrol i stedet for. På min Outlook Form har jeg så brugt en ElementHost som jeg har docket min WPF usercontrol i.

WPF
Her må jeg blankt erkende at jeg startede på Hello World stadiet. Jeg erkendte hurtigt mine manglende kvalifikationer. Jeg tog derfor en dag ud af kalenderen, kørte til Fakse, og besøgte Imasoft. Her brugte vi vel 4 timer effektivt på at få sat projektet op. Super hvad man får ud af at sidde sammen med eksperter :-) Vi lavede skabelonerne til 3 usercontrols:

MeetingRoomsTab: Denne kontrol er faktisk kun indholdet af en tab, er et grundplansbilledet plus nogle MSMeetingRoomUI kontroller. Bag ved billedet ligger der et Canvas, som kun har til formål at sørge for at flytte mødelokalerne relativt i forhold til størrelsen af grundplansbilledet:
<Canvasx:Name="InteractiveCanvas" MouseDown="InteractiveCanvas_MouseDown"
  
SizeChanged="InteractiveCanvas_SizeChanged" 
  
Width="{BindingElementName=InteractiveImage,Path=ActualWidth}"
  
Height="{BindingElementName=InteractiveImage,Path=ActualHeight}" 
  
VerticalAlignment="Center" HorizontalAlignment="Center" 
  
Background="Transparent" />

Kudos til Imasoft som viste mig hvordan man kunne binde elegant i XAML.I codebehinden ser eventhandleren ud som følgende:

void InteractiveCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
    foreach (MeetingRoomUI room in Rooms)
    {
        Canvas.SetLeft(room, room.Position.X * InteractiveCanvas.ActualWidth);
        Canvas.SetTop(room, room.Position.Y * InteractiveCanvas.ActualHeight);
    }
}

På denne vis er mødelokalerne altid placeret det samme sted oven på grundplansbilledet.

MSMeetingRoomUI: Reelt set er dette bare en Button som er stylet til bare at være en cirkel. Kontrollen har to public events:

public delegate void MeetRoomSelectedDelegate(string strRoomName);
public event MeetRoomSelectedDelegate MeetRoomSelected;

public delegate void MeetRoomHoverDelegate(DTO.MeetingRoom dto);
public event MeetRoomHoverDelegate MeetRoomHover;

Formålet er at give besked om når et mødelokale er valgt, samt når man holder musen hen over et mødelokale. MeetingRoom objektet er bare en POCO som indholder data om et mødelokale, herunder om det er optaget eller ej.

MSMeetingRooms: Denne usercontrol den øverste container/usercontrol. Den indeholder en en TabControl, en ProgressBar nederst, og en række customcontrols til venstre, herunder en RSS Streamer (en viewer af RSS feeds).
Når jeg fra min Outlook Form instantierer min MSMeetingRooms kontrol (uc nedenunder), så kan jeg dynamisk tilføje mine mødelokaler, som jeg henter fra mit Data Access layer (dal), til Tab kontrollen på MSMeetingRooms.

dal = new DAL.MeetingRoomDAL();
uc.AddMeetingRooms(0, dal.meetingRoomList.
Where(r => r.Floor == 2).Select(r => r).ToList<DTO.MeetingRoom>()); uc.AddMeetingRooms(1, dal.meetingRoomList.
Where(r => r.Floor == 4).Select(r => r).ToList<DTO.MeetingRoom>());

På dal objektet ligger der en List<MeetingRoom> (meetingRoomList) hvor MeetingRoom er POCO'en. Listen instantieres ved at læse data fra en XML fil:

<Rooms>
  <
RoomRoomName="Conf Room MSDAS Venus (eks, 8 pers.)" Email="XXXXX@microsoft.com" Floor="2" Name="Venus">
    <
RelativeCoordinatex="0.17063" y="0.4525561" />
    <
Location>HELLERUP/217</Location>
  </
Room> ....

Jeg lavede en lille helper til at tage de kendte informationer ud af AD'et og skrive dem til XML'en. Jeg brugte DirectorySearcher til at søge i AD, og LINQ to XML for at få det skrevet til en XML fil. Efterfølgende skulle jeg så bare indsætte RelativeCoordinate. Til at finde de relativekoordinater lavede jeg en primitiv Click event på mit grundplansbillede der kunne fortælle mig de relative koordinater på billedet når jeg trykkede på det. Dem kunne jeg så efterfølgende sætte ind i XML filen.

Data Access layer, Exchange webservices
Efter først at være inde over MAPI og ikke rigtig kunne få hul igennem til at læse andres kalendere (mødelokalerne), så valgte jeg Exchange Webservices. Det har været stort set smertefrit. Jeg kan sende et request afsted og bede om free/busy information for 42 mødelokaler og få svar tilbage på ca 15 sekunder. Jeg tog udgangspunkt i denne kode, som jeg wrappede i en singleton, samt ændrede konfigurationen. Der var bla noget med timezone der skulle sættes. Kig på koden, den er lige til at gå til. 

Eneste problem jeg har er, at somme tider ikke kan blive autentificeret mod Exchange endpointet. 

private ExchangeServiceBinding service = new ExchangeServiceBinding();

private ServiceSession()
{
    this.service.Url = ServiceUrl;
    this.service.Credentials = CredentialCache.DefaultCredentials;
    this.service.RequestServerVersionValue = new RequestServerVersion();
    this.service.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
}
Når jeg får denne periodiske "fejl", viser jeg et login billede og beder om username, password og domain, som jeg kan bruge til at instantiere en ny NetworkCredential med. Jeg vil tro at det hænger sammen med at mit token udløber?

Desuden har jeg måtte lave en customexception som jeg kan smide hvis ikke Exchange svarer som forventet. Jeg var udsat for at et enkelt mødelokales kalender ikke var tilgængelig. I så fald viser jeg mødelokalet med grå farve, i stedet for grøn, rød eller gul.

Deployment
Jeg valgte at deploye med clickonce. Lige så snart applikationen ikke er helt trivielt, bliver det pludselig temmelig besværligt. Først var jeg ude i at jeg ville publicere applikationen på internettet. Men så fordi jeg ikke havde et offentlig udstedt certifikat, så skulle man downloade et jeg havde lavet og tilføje det under "Root Certification Authorities" før man kunne køre ClickOnce installationen. Så gik jeg over til at deploye på en intern server der er på vores domæne. Det gik fint. Indtil jeg refaktorerede add-in'et til at starte en "SplashScreen" i en ekstern proces. Så røg jeg ud i at SplashScreen.exe ikke var signet med det rigtige certifikat og dermed kunne clickonce installationen ikke gennemføres. Så jeg måtte rulle tilbage og have splashscreen'en som en del af Add-in'et. Grunden til refaktoreringen var threading i VSTO.

Hvis der var flere timer i døgnet
Der er selvfølgelig flere ting som ligger lige til højrebenet at lave, når man engang får mere tid...

  • Integration til Office Unified Communition Server - så man kan "sparke" (sende en IM) til dem der burde sidde i et møde lokale og ikke gør det
  • Styling, styling, syling, templates, template, templates
  • Bestil opdækning (en mulighed i den gamle version).
  • Threading. Der er øjensynligt mere at hente. Specielt er RSSVieweren lidt hård når det hentes et feed. Opstartstiden af VSTO add-in'et kan formentlig også forbedres.
  • Opsamling af booking informationer, således belægning af møderum kan analyseres

I denne situation er udviklingen dog ikke brugerdrevet, men udelukkende egodrevet;-)

Tips & Tricks:

For at minimere opstartstiden af Outlook, og spare de efterfølgende museklik, så kan man åbne en Appointment direkte ved at sætte "start external program" til Outlook.exe samt give nogle kommandolinie parametre med:  

image

Du kan se alle kommandolinje parametrene her.

Jeg lavede også en testklient i ren WPF, så jeg ikke behøvede at boote outlook hver gang.

Når jeg engang er tilbage fra ferie, skal jeg nok publicere koden.

Michell Cronberg har lavet en valutakurs add-in til Excel, som du kan hente og læse om her.

God sommer!

Facebook gruppe for dem der skal med til PDC 2008

Jeg har oprettet en facebook gruppe for dem der skal med til PDC. Så skal du med til PDC, må du meget gerne tilslutte dig gruppen.

I gruppen vil du så også kunne mødes med andre der skal på PDC.

Ses der!

SharePoint udvikling med Visual Studio 2008

Endelig er der kommet tools til SharePoint udvikling til Visual Studio 2008. Bemærk at du skal køre Visual Studio 2008 32 bit. Umiddelbart er der ikke noget der tyder på at Visual Studio Extensions til WSS 3.0 kommer til at understøtte x64.

Version 1.2 er kun lavet til Visual Studio 2008 og der er ikke nogle yderligere features i forhold til 1.1. Du skal stadig bruge version 1.1 hvis du bruger VS 2005.

Læs mere på SharePoint teamets blog.

Enterprise library: Logging application block

I min sidste blogpost om Enterprise library (EL), lagde jeg ud med at næve Logging Application Block som et sted at starte med EL. Så her er mit take på logging application block. Enterprise library dokumentationen på MSDN er ret god.

Overordnet er der (mindst) to vigtige grunde til at implementere et struktureret logging. For det første, hvis du ikke har struktureret logging, så bliver test og udvikling af løsninger svært, eftersom det kan være svært at identificere hvor, hvornår og hvorfor fejlen opstår. Hvis alle services & komponenter som indgår i løsningen foretager struktureret logging, gøres fejlsøgning lettere. Udover udvikling og test fordelene, så skal løsningerne overgå til produktion og drift på et tidspunkt. Hvis driftafdelingen skal have en chance for at kunne agere/reagere fornuftigt og hurtig på eventuelle kritiske systemfejl, så skal alle komponenter på en begavet måde give besked om hvad fejlen er.

Hvorfor et loggingframework?
Basalt set, så implementeres loggingframeworks for kunne konfigurere sig ud af hvordan selve loggingen skal foregå. Det er vigtigt fordi, at vi ved deployment tidspunktet gerne vil kunne bestemme hvilke informationer, samt hvortil der skal logges, f.eks. til eventlog, flat file, rolling file, msmq etc. Generelt for Enterprise Library er at man selv udvide de forskellige Application Blocks så de passer til ens behov.

Hvordan virker det så?
Før vi kigger på konfigurationen, så lad os hurtigt kigge på hvad der skal til i koden for at log-enable din kode. 

Ind med namespaces:

   1: using Microsoft.Practices.EnterpriseLibrary.Logging;
   2: using System.Diagnostics;

I det efterfølende er der fire scenarier. Linie 1 skriver en besked i debug kategorien - altså noget der bruges til udvikling. Linie 4 initierer en logentry uden kategori, men sat til Critical, altså noget vi skal fange og logge. Linie 7 logger en besked i to kategorier (General og RaiseAlert) sat til Error. Sidste logentry i linie 10 logger til to kategorier, og er blog en information.

Det som man skal ligge sig fast på her er hvordan man bruger de forskellige properties på LogEntry.

  1. Hvilke kategorier man bruger (sæt selv nogle ind, jeg har valgt at bruge Debug, General, RaiseAlert)
  2. Hvornår man bruger hvilke TraceEventTyper (Critical, Error, Warning, Information, Verbose etc)
  3. Hvordan man bruger priority
  4. Hvad man skriver i message og title - formentlig er det en god ide at have en standard, så ikke det bliver til ren lyrik, eller dårlige citater
  5. Desuden er det en god ide at eventid er unikt, således at man entydigt kan referere til en bestemt type fejl
   1: LogEntry  le = new LogEntry { Categories = new string[] { "Debug" }, Message = "Starting app", Severity = TraceEventType.Verbose, Title = "Starting app", Priority = 1000, EventId=1 };
   2: Logger.Write(le);
   3:  
   4: le = new LogEntry { Message = "No category, but critical", Severity = TraceEventType.Critical, Title = "Easy comes, easy goes", Priority = 1, EventId=2 };
   5: Logger.Write(le);
   6:  
   7: le = new LogEntry { Message = "Category & and criticial", Categories = new string[]{"General", "RaiseAlert"},  Severity = TraceEventType.Error, Title = "Whats up doc?", Priority = 1, EventId=3 };
   8: Logger.Write(le);
   9:  
  10: le = new LogEntry { Categories=new string[]{"Debug", "General"}, Message = "Debugging info", Severity = TraceEventType.Information, Title = "I will be back!", Priority = 1, EventId=4};
  11: Logger.Write(le);

Efterfølgende så kan jeg (eller en anden) så tage stilling til hvor jeg have kanaliseret de forskellige fejlbeskeder hen, samt hvad der skal logges. Selv er jeg fan er logfiler ;-) Men når først man går i produktion, så er der formentlig nogle processer og værktøjer man skal tilpasse sig, således driften kan holde enderne samme på systemet.

image

Jeg har valgt en konfiguration som ser ud som følende, hvis man bruger "enterprise library designeren". Jeg starter med at vise designeren. Selve App.config konfigurationen er inkluderet forneden.

Formatters
Her specificerer man hvad man vil have logget, samt hvilket format det skal have: Timestamp: {timestamp(local)}
Hvis ikke du har (local) med, så rammer du ikke den rigtige tidszone.

Trace Listeners
Jeg har konfigureret 4 trace listeners. 1 TraceListener der logger til Console. 2 TraceListener der logger til filer, Error FlatFile TraceListener skriver til c:\temp\myapp\error.log, og Debug FlatFile TraceListener skriver til c:\temp\myapp\debug.log. Desuden er der en Formatted Eventlog Tracelistener der skriver windows eventloggen.

Special Sources
Her kan du vælge at binde dine forskellige trace listeners op imod nogle predefinerede kilder. Eksempelvis skriver jeg alle logentries som ikke har en kendt kategori til min Error FlatFile TraceListener. Alle fejl ryger i samme TraceListener.

Category Sources
Lidt mere interessant bliver det i Category sources. Her kan du specificere hvilke TraceListeners der skal bruges til hver kategori. Her har jeg kun 3 kategorier. En logentry kan godt have mere end en kategori (se linie 7 i eksemplet ovenfor), hvilket betyder beskeden bliver logget til flere tracelisteners.

Filters
Sidst har man helt overordnet mulighed for at sætte filtre op for hvad man ønsker logget.

Resultatet af ovenstående er følgende App.Config fil.

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
   5:   </configSections>
   6:   <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
   7:     defaultCategory="" logWarningsWhenNoCategoriesMatch="true">
   8:     <listeners>
   9:       <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.SystemDiagnosticsTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  10:         traceOutputOptions="None" filter="All" type="System.Diagnostics.ConsoleTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  11:         name="Consolel TraceListener" initializeData="" />
  12:       <add fileName="c:\temp\myapp\debug.log" header="" footer="----------------------------------------"
  13:         formatter="Text Formatter" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  14:         traceOutputOptions="None" filter="Verbose" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  15:         name="Debug FlatFile TraceListener" />
  16:       <add fileName="c:\temp\myapp\error.log" header="" footer="----------------------------------------"
  17:         formatter="" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  18:         traceOutputOptions="Callstack" filter="Error" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  19:         name="Error FlatFile TraceListener" />
  20:       <add source="MyKillerApp" formatter="Text Formatter" log="Application"
  21:         machineName="HWHMCEx64-PC" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  22:         traceOutputOptions="DateTime" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  23:         name="Formatted EventLog TraceListener" />
  24:     </listeners>
  25:     <formatters>
  26:       <add template="Timestamp: {timestamp(local)}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;"
  27:         type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  28:         name="Simple Text Formatter" />
  29:       <add template="Timestamp: {timestamp(local)}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Priority: {priority}&#xD;&#xA;EventId: {eventid}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;Machine: {machine}&#xD;&#xA;Application Domain: {appDomain}&#xD;&#xA;Process Id: {processId}&#xD;&#xA;Process Name: {processName}&#xD;&#xA;Win32 Thread Id: {win32ThreadId}&#xD;&#xA;Thread Name: {threadName}&#xD;&#xA;Extended Properties: {dictionary({key} - {value}&#xD;&#xA;)}"
  30:         type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  31:         name="Text Formatter" />
  32:     </formatters>
  33:     <categorySources>
  34:       <add switchValue="Verbose" name="Debug">
  35:         <listeners>
  36:           <add name="Debug FlatFile TraceListener" />
  37:         </listeners>
  38:       </add>
  39:       <add switchValue="All" name="General">
  40:         <listeners>
  41:           <add name="Error FlatFile TraceListener" />
  42:         </listeners>
  43:       </add>
  44:       <add switchValue="All" name="RaiseAlert">
  45:         <listeners>
  46:           <add name="Formatted EventLog TraceListener" />
  47:         </listeners>
  48:       </add>
  49:     </categorySources>
  50:     <specialSources>
  51:       <allEvents switchValue="All" name="All Events" />
  52:       <notProcessed switchValue="All" name="Unprocessed Category">
  53:         <listeners>
  54:           <add name="Error FlatFile TraceListener" />
  55:         </listeners>
  56:       </notProcessed>
  57:       <errors switchValue="All" name="Logging Errors &amp; Warnings">
  58:         <listeners>
  59:           <add name="Error FlatFile TraceListener" />
  60:         </listeners>
  61:       </errors>
  62:     </specialSources>
  63:   </loggingConfiguration>
  64: </configuration>

Resultatet bliver at der kommer 2 beskeder i c:\temp\myapp\debug.log (eventid 1 & 4) og 2 beskeder i c:\temp\myapp\errors.log (eventid 2 & 3). Desuden bliver eventid 3 også logget til eventlog fordi den blandt andet har kategorien RaiseAlert (linie 7 i eksemplet).

image

Der er mange interessante udvidelser man kan lave, hvis man har tid og behov. Eksempelvis kunne man overveje at lave en tracelistener som implementerer noget ala "Send error report to Microsoft". På denne måde vil du kunne opsamle brugerinput, stacktraces etc, hvis brugeren vælger at sende fejlrapporten til dig. Så der er man formentlig ude i noget WS eller WCF.

Endnu mere interessant bliver det når vi begynder at trække de andre application blocks med ind. Eksempelvis giver det god mening at kigge Exception Handling Application Block og Policy Injection Application Block efterfølgende. Stay tuned.

Dette lille sample kan du downloade her.

Der findes mange frameworks som håndterer logging. log4n skal også nævnes, som er udbredt logging framework.

Registrering til PDC08

Så er det muligt at registrere til Professional Developers Conference (PDC): http://www.microsoftpdc.com/

PDC afholdes 27-30 oktober i Los Angeles Convention Center. Melder du dig til inden 15. august koster det 2195$, efterfølgende koster det 2395$.

Agendaen kan du se her: http://www.microsoftpdc.com/Agenda/Sessions.aspx

Hvis man kigger på agendaen, så er det klart Live/Cloud Services, Mesh og Data Services der præger agendaen. Windows 7, Visual Studio Team System (Rosaio), Silverlight og OBA får også en del opmærksomhed.

PDC er der hvor Microsoft annoncerer de teknologier som kommer de næste 1-3 år, så PDC er det helt rigtige sted at blive inspireret og informeret om hvor Microsoft er på vej hen.

Enterprise library 4.0 - tid at spare, fleksibilitet at hente

Enterprise library 4.0 til Visual Studio 2008 og .NET 3.5 er udkommet og kan downloades her. Enterprise library (EL) er, set gennem min optik, en meget overset ressource. Med EL kommer der en række application blocks som hver i sær adresserer generelle problemer - problemer kendt som "de dybe tallerkener" :-)

De application blocks som er med i EL beskrives på MSDN:

  • Caching Application Block. Developers can use this application block to incorporate a cache in their applications. Pluggable cache providers are supported.
  • Cryptography Application Block. Developers can use this application block to incorporate hashing and symmetric encryption in their applications.
  • Data Access Application Block. Developers can use this application block to incorporate standard database functionality in their applications.
  • Exception Handling Application Block. Developers and policy makers can use this application block to create a consistent strategy for processing exceptions that occur throughout the architectural layers of enterprise applications.
  • Logging Application Block. Developers can use this application block to include standard logging functionality in their applications.
  • Policy Injection Application Block. Developers can use this application block to implement interception policies that can be used to streamline the implementation of common features, such as logging, caching, exception handling, and validation, across a system.
  • Security Application Block. Developers can use this application block to incorporate authorization and security caching functionality in their applications.
  • Unity Application Block. Developers can use this application block as a lightweight and extensible dependency injection container with support for constructor, property, and method call injection.
  • Validation Application Block. Developers can use this application block to create validation rules for business objects that can be used across different layers of their applications.

Den bedste anbefaling jeg kan give her er at udvælge nogle, måske kun en, application blocks og fokusere der. Logging application block er for mig at se et muligt sted at starte, hvis man skal i gang med EL.

Når du installerer EL, så får du mulighed for at konfigurere de forskellige application blocks ved at højre-klikke på App.config og lave en "Edit Enterprise Library Configuration".

 

 

 

 

 

 

 

 


Efterfølgende få du vist de konfigurationsmuligheder du har til de application blocks du vælger at aktivere.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Der er rigtig god dokumentation at hente på MSDN til hver application block - se ovenfor.

Smid endelig en kommetar hvis du har erfaringer med EL som du vil dele.

Open source udvikling & licenser

Herunder er invitationen til vores næste open source arrangement.

Foredrag: Mød advokat Martin von Haller Grønbæk til Microsoft Open Source Community Day d 29. april i Hellerup

I forlængelse af vores arrangement i januar, vil vi igen invitere dig til et møde om forretningsmuligheder med udvikling af Open Source applikationer på Microsoft platformen.

Vi har denne gang inviteret advokat for Open Source udviklere, Martin von Haller Grønbæk. Han vil fortælle om de juridiske aspekter i forhold til at drive en Open Source forretning – herunder: Ophavsret, licensiering, forretningsmodeller og cases samt juridiske problemstillinger.

Hvad betyder Interoperabilitet? Mens standarder, API’er, protokoller etc. alle er vigtige tekniske midler, så er interoperabilitet langt tættere på selve målet. Interoperabilitet er begrebet for det, som overordnet set sætter systemer i stand til at udveksle informationer.  Det er når systemer taler sammen, at vi opnår de helt store fordele med øget borgerservice, en mere effektiv digital forvaltning og mange andre fordele. Hør teknologichef Jasper Hedegaard Bojsen fra Microsoft fortælle om vores arbejde omkring -  og tilgang til interoperabilitet.

Agenda:

09:15 – 09:30   Ankomst og registrering

09:30 – 09:45   Velkomst v/ Direktør for Platform & Udviklere (DPE) Ole Kjeldsen, Microsoft

09:45 – 12:00   Juridiske aspekter ift til at drive en Open Source forretning

v/Advokat Martin von Haller Grønbæk

12:00 – 12:45   Microsoft og interoperabilitet v/Teknologichef Jasper Hedegaard Bojsen, Microsoft

12:45 – 13:30   Networking og frokost

Der vil naturligvis blive indlagt pauser efter behov. Vi ønsker at det bliver en åben dialog, hvor du har mulighed for at stille spørgsmål og være med til at præge dagen.

Tid og sted: Den 29. april  kl. 9:15 – 13:30                                  

Microsoft Danmark

Tuborg Boulevard 12

2900 Hellerup

Tilmelding: Send en email til piaw@microsoft.com .  Sidste frist er den 27. april.

METRO: Workshop i Office Unified Communication

Den 29. og 30. april kører vi en Workshop for ISV'er i Unified Communication. Workshoppen afholdes i Microsoft Innovation Centre i Vedbæk. Det er et krav at virksomheden er med i Metro. En beskrivelse af indholdet er nederst i denne blogpost.

For at komme med i Metro, du (helst) være Certified eller Gold Certified partner. Er virksomehden ikke i Metro kan jeg melde dig ind, således virksomheden få adgang til Metro. I Metro vil der være et tilmeldingslink. Send mig en mail, hvis du vil med i Metro.

Der er begrænsede pladser, så jeg kan ikke garantere at alle komme med på workshoppen. ISV'er der allerede har indikeret i Metro at de bygger løninger på OCS har fortrinsret.

UPDATE: Du kan nu også tilmelde dig gennem dette link: https://training.partner.microsoft.com/plc/details.aspx?publisher=12&delivery=244862

Vi ses der!

-----

Unified Communications Platform Developer Training

Office Communications Server (OCS) 2007 and Exchange Server 2007 provide the infrastructure for enterprise communications including e-mail, voice, video, IM, conferencing and unified messaging. Building on this infrastructure, the UC Platform APIs provide a platform that you can leverage to build communications into your solutions adding incredible value to your users. 

The Unified Communications Platform APIs can be used to add communication features to you apps including:

· Contextual Collaboration: Enabling human-to-human communications by embedding presence into your application and launching IM, voice and video communications from your application using data from your app to provide conversation context.

· Business Process Communication: Providing machine-to-human communications to remove the human latency from automated business processing using IM and voice to reach users quickly and conveniently. This includes:

o Broadcast IM: Sending IM notifications to many users in a secure and scalable fashion.

o IVR Application: Using text to speech and automated speech recognition to call users and use voice to complete steps in a business process.

· Anywhere Information Access: Providing human-to-machine communications to provide secure and convenient access to information using IM or voice communications. This includes:

o Automated IM Agents: IM contacts that are services running on the back end to provide access to enterprise data from and UC IM client.

o IVR Applications: Providing speech applications that front end enterprise data using automated speech recognition and text to speech.

This is your opportunity to get hands-on experience with the Unified Communications Platform SDKs, OCS 2007, OCS 2007 Speech Server, Exchange Server 2007 and OC 2007. Sessions will be a combination of instructor-led training with proctored, hands-on labs, designed to give you first-hand experience developing with the Unified Communications Platform. This is a fast-paced, 2 day course designed for experienced software developers and solution architects. Familiarity with VS 2005 and .NET Framework 2.0 is required.

Registration is open to all partners enrolled in the Unified Communications Metro program. Please review the details and topics below and register to reserve your seat today!

Target Audience

This 2 day, instructor-led, hands-on event is a technical workshop designed for experienced software developers and solution architects.

Topics

This training course offers an end-to-end view of the Unified Communications Platform.

Overview of training topics:

· Overview

o Building Software on the Unified Communications Platform

o Unified Communications: Behind the Scenes with OCS 2007, OC 2007 and Exchange 2007

· Building Communications Into Custom Clients

o Driving Contextual Collaboration with OC 2007

o Building Contextual Collaboration Clients for the Web using the UC AJAX SDK

o Building Asynchronous Contextual Collaboration with Exchange Web Services

· Building Services

o Business Process Communication with the UCMA, Part 1.

o Business Process Communication with the UCMA, Part 2.

o Anywhere Information Access with OCS 2007 Speech Server

Course Prerequisites

Prior to attending the 2-day, instructor led workshop, partners should familiar with VS 2005 and the .NET Framework 2.0.

Metro - Vær blandt de første på nye teknologier

image Er din virksomhed med i Microsofts partnerprogram, og ser du en fordel i at være velinformeret om nye teknologier og måske endda bygge ISV-løsninger ovenpå nye teknologier, så er Metro stedet du får oplysninger, support direkte fra produktteamet, kursustilbud i og uden for Danmark.

For at komme med i Metro skal du sende mig en email. Når jeg har modtaget en mail fra dig, går der lidt tid, så får du en velkomstmail.

I Metroportalen bliver du så bedt om at profilere din applikation, samt tilmelde dig forskellige teknologi-rytmer (spor). Når du først er inde i Metro, kan du selv invitere andre kollegaer. I skrivende stund kan du tilmelde dig følgende rytmer, under hver rytme er der en række spor/specialiseringer:

  1. Dynamics AX (AX 5.0)
  2. Dynamics CRM (CRM Titan)
  3. Office System (Office Applications, UC, Office live)
  4. SQL Server 2008 (Business Intelligence, Database Development, Infrastructure & Scalability, Upgrades & App Compatability)
  5. Vista ("Light up", WPF, Windows Vista Certified Logo)
  6. Visual Studio 2008 (.NET 3.5, Connected Applications, Lifecycle tools, Mobile applications, Office applications, Rich client applications, web applications)
  7. Web UX (ASP.NET AJAX, Expression Suite, Media Scenario, Silverlight, Windows live services)
  8. Windows Server 2008 (Application Compatibility and Certification, Application Platform, Cor Fundamentals, HPC, Management, Web Applications)

Mange ISVer har før være med i Ascend og Touchdown early adoption programmerne. Det er disse to programmer der har udviklet sig til Metroprogrammet. 

Kontakt mig endelig hvis du har nogle spørgsmål: 44890773.

ISVNXT - Få gratis hjælp til at migrere til Microsoft

image Hvis din løsning er på en anden platform end Microsoftplatformen og overvejer du at migrere, så kan du gennem ISVNXT få økonomisk støtte til det.

Processen er enkel. Du registrer dig på siden, efterfølgende bliver du kontaktet for at få løsningen vurderet. Derefter bliver du matchet med en delivery partner (konsulent). Microsoft betaler konsulenten 3-4 dage for at lave en overordnet arkitektur eller et proof of concept, afhængig af dit behov.

Jeg er helt sikker på at man ikke kan nå i mål på 3-4 dage, men forhåbentlig kan man efterfølgende lave en vurdering af fordele, ulemper og projektets størrelse.

Send mig endelig en mail hvis du har spørgsmål!

InnovateOn - fasttrack spor til Microsoft partnerskab & certificering

InnovateOn er et self-service website, der hjælper ISV'er til et partnerskab medio_header_background Microsoft. På sitet finder du informationer som er målrettet mod at få en løsning certificeret, og dermed få flere points i partnerprogrammet.

Når man registrer sig, så får man flere fordele alt afhængig af hvilke og hvor mange teknologier man har valgt at bygge løsningen på. Men her er nogle fordele:

  1. Vouchers til at blive certificeret.
  2. Support (antal timer er afhængig af hvor mange og hvilke teknologier der er valgt)
  3. VeriTest Voucher
  4. NSTL Test Voucher
  5. Verisign Code Signing Voucher

Pt er der en række teknologier på InnovateOn: Microsoft Dynamics, 2007 Microsoft Office system, Microsoft Office Live, Microsoft SQL Server, Windows Live, Windows Mobile, Windows Server 2008 og Windows Vista.

Når du har profileret din applikation som du ønsker at få certificeret, så der gode ressourcer som kan hjælpe dig igennem faserne: Learn, Build og Market. Det vil sige, at der er hjælpe at hente helt fra ide til salgsfasen.

Send mig en