Merging .NET assemblies using ILMerge

Today I had a problem about multiple dll registration plugin for MSCRM. This plugin was registered on Database and I could not update this one because I needed the others libraries. I had two soltions: First, I could register it on GAC. I don’t like because I had problem on production during the installation of the new solution. The second one was to use ILMERGE to merge all dll and create an unique dll to register. I choose the second solution. ILMerge is useful tool on Microsoft. This little gem makes it possible to link multiple assemblies to a single one.

First, you would compile your libraries to DLLs and your program to an EXE referencing the DLLs. This is exactly what Visual Studio would do if you had multiple libraries and a program referencing these libraries, so there is no need to do this on the command line.

Later you can link these parts to a single self-contained EXE, DLL, using ILMerge:

echo %1
%1Build\ILMerge.exe /keyfile:%1Properties\keys.snk /target:library /copyattrs /targetplatform:v4,"C:\Windows\Microsoft.NET\Framework\v4.0.30319" /out:%1Build\final\namedll %1Build\library.dll %1Build\Castle.Core.dll %1Build\Castle.Windsor.dll %1Build\Microsoft.WITDataStore.dll %1Build\Newtonsoft.Json.dll %1Build\Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll

The nice thing about this is that you can also merge third party assemblies like commercial class libraries into your program. And you do not have to modify your build process.

I found ILMerge tremendously useful, and I think that something like this should be a part of the .NET framework SDK. Maybe just enhance al.exe so that it can also link DLLs.

I have only scratched the surface of the .NET build process and the capabilities of ILMerge, and this article might contain many inaccuracies or even errors. But I found ilmerge.exe so useful that I just had to write about it.

I found a GUID for MERGE,

image_thumb_681250B1

but I prefer the line command. I insert on build process this rows:

copy /Y "$(TargetDir)" "$(ProjectDir)Build"
call "$(ProjectDir)Build\Merge.bat" $(ProjectDir)
cd "$(ProjectDir)Build"
del *.dll *.pdb Winvs*

In this way, after the build, all dlls are copied on Build folder and the Merge command is called. The merge.bat is the following:

echo %1
%1Build\ILMerge.exe /keyfile:%1Properties\keys.snk /target:library /copyattrs /targetplatform:v4,"C:\Windows\Microsoft.NET\Framework\v4.0.30319" /out:%1Build\final\namedll %1Build\library.dll %1Build\Castle.Core.dll %1Build\Castle.Windsor.dll %1Build\Microsoft.WITDataStore.dll %1Build\Newtonsoft.Json.dll %1Build\Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
Annunci

Changing local path in team foundation server

application-lifecycle-managementIf you want to change the local path for the working directory of the Team Foundation Server (TFS), you need to go to File -> Source Control -> Workspaces, then select your workspace (it should match your computer name) and click Edit.

In the next dialog change the mapping for the root TFS node to the new location on your hard drive.

Important! You need to perform a “Get” on the whole TFS tree to update project associations.

Utilizzare WordPress con C#

imagesFinalmente ho deciso (e trovato il tempo) di creare il mio sito personale (ormai tutti hanno un sito personale 🙂 ).

In home page voglio dare la possibilita’ di visualizzare i post principali che scrivo su wordpress; per fare questo ho pensato a diverse soluzioni:

  • converto tutto in .NEt sbarazzandomi di WordPress
  • decido di utilizzare wordpress sui miei server e quindi avere controllo anche del database (in questo modo posso fare le query direttamente sul db)
  • cerco su internet qualche plugin o framework che mi possa aiutare ad integrare wordpress nel mio sito.
  • utilizzare webhooks per pushare le informazioni direttamente dal blog di WordPress
  • dato che voglio solo visualizzare i miei posts e non voglio inserire post direttamente da .net, si puo’ leggere direttamente rss feed che rendo disponibile da mio sito.

Per adesso ho deciso di utilizzare l’ultima possibilita’: meno costosa (gratis)… piu’ semplice da utilizzare e piu’ veloce da fare.

Prima di tutto creiamo il modello di oggetto che identifica il  POST:

public class Post
{
   public string Title { get; set; }
   public string Url { get; set; }
   public string Author {get; set;}
   public DateTime PublishedDate { get; set; }
}

Adesso andiamo a leggere i post dal link del mio rss feed di wordpress. Ho creato un semplice parser per leggere queste informazioni:

public static IList GetBlogPosts(string postUrl, int postCount)
{

string xml;

using (WebClient downloader = new WebClient())
{
   using (TextReader reader =
      new StreamReader(downloader.OpenRead(postUrl)))
{
xml = reader.ReadToEnd();
}
}
// Sanitize the XML
xml = XmlCommon.SanitizeXmlString(xml);
XmlDocument xmlDoc = new XmlDocument();
//Load feed via a feedUrl.
TextReader tr = new StringReader(xml);
var doc = XDocument.Load(tr);

XNamespace dc= "http://purl.org/dc/elements/1.1/";

//Get all the "items" in the feed.
var feeds = doc.Descendants("item").Select(x =>
new Post
{
//Get title, pubished date, and link elements.
Title = x.Element("title").Value, //3
PublishedDate = DateTime.Parse(x.Element("pubDate").Value),
Author = x.Element(dc + "creator").Value,
Url = x.Element("link").Value
} //  Put them into an object (Post)
)
// Order them by the pubDate (Post.PublishedDate).
.OrderByDescending(x=> x.PublishedDate)
//Only get the amount specified, the top (1, 2, 3, etc.) via postCount.
.Take(postCount);

//Convert the feeds to a List and return them.
return feeds.ToList();
}

Volevo farvi notare la seguente riga di codice:

xml = XmlCommon.SanitizeXmlString(xml);

In questo modo andremo a ripulire il nostro XML. Il file rss di wordpress viene creato con dei caratteri non validi per le specifiche XML.Qui trovate un articolo che spiega meglio il pattern utilizzato.

Infine se potremmo anche creare una cache per non rallentare il caricamento. Ecco qualche lineea di codice:

//Check if feed exists
if (HttpRuntime.Cache["WordPressPost"] == null)
				{
					//If it is, insert it into the cache, cache for 10 minutes
					HttpRuntime.Cache.Insert("WordPressPost",
						FeedReader.GetBlogFeed("url", 5), null, SystemTime.Now().AddMinutes(10), Cache.NoSlidingExpiration);
				}

//retrieve cached feeds
var cachedFeeds = (List) HttpRuntime.Cache["WordPressPost"]

Ora possiamo avere i nostri post di worpress nella nostra homepage. Ho creato un piccolo progetto di esempio in Github

Cercando su google ho trovato WP.NET e un ottimo articolo sol suo utilizzo : Extending-WordPress-with-Csharp-Plugins. Con WP.Net e’ possibile utilizzare wordpress con .net.

Snoop WPF un aiuto prezioso!!!

Molte volte, a me capita spesso con wpf, un layout a runtime ha un funzionamento differente da quello aspettato. Potrebbe essere difficile visualizzare a codice alcuni oggetti ( magari vengono creati automaticamente: pensate ad una treeview). Un mio collega qualche tempo fa mi ha suggerito un tools chiamato Snoop: Da quel giorno non ne posso fare a meno!!!!!!!!!

Con snoop potrai spiare a runtime tutto il tuo codice, visualizzare il layout in 3D per capire come i content panel funzionano e modificare a runtime le proprieta’ degli elementi sul tuo progetto!!!

Il suo utilizzo e’ sempliccissimo: Eseguiamo la nostra applicazione e poi eseguiamo snoop. Dal menu (vedi immagine seguente) selezionare il mirino vicino al cannocchiale e trascinarlo sulla nostra applicazione.

Adesso e’ possibile navigare il nostro albero e modificare le proprieta’ oppure visualiizare il layout in 3d…. Lo reputo un aiuto prezioso per debuggare il nostro WPF!!!

Per una documentazione approfondita ecco il link: http://blois.us/Snoop/

Fatemi sapere cosa ne pensate. Io lo trovo eccezionale.

Layout 3D e Proprieta’ Layout

Office 2010 professional eng: Reinstallazione su notebook dell

Ho acquistato un portatile nuovo e, come il mio solito formatto tutto e reinstallo. Mi sono accorto di una cosa: non ho trovato il dvd di installazione del pacchetto Microsoft Office 2010. Dopo aver litigato col supporto tecnico, ho iniziato a girare su google per capire come fare. Ho trovato questo bellissimo servizio per poter scaricare il proprio prodotto Microsoft. Per poter però procedere con il download, bisogna utilizzare la chiave di attivazione allegata al pc. Finalmente un buon servizio di Microsoft.
Ecco il link per il pacchetto di Office 2010 professional : http://office.microsoft.com/en-gb/buy/netbook-FX101829141.aspx

NB: Questo servizio è valido per tutte le applicazioni Microsoft in versione OEM

TweetDeck

Ciao,
oggi volevo condividere con voi un ottimo strumento: TweetDeck. Tweet Deck permette di pubblicare con un unico click un post su tutti i profili di twitter, facebook, linkedin, etc. Avendo diversi profili : il profilo personale, quello aziendale, quello su linkedin, quello su facebook cercavo un programma che mi gestisse tutti con un semplice click. TweetDeck è quello che fa per me: grafica semplice, tutto a portata di mano e configurazione facile.

Il link per scaricare il programma è : http://www.tweetdeck.com/

Consiglio!!!

http://bit.ly/ : indirizzi alle pagine “corti”

Il mio solito collega Paolo Aliverti, mi ha consigliato questo tool web : http://bit.ly/ L’applicazione consente di creare degli alias ad indirizzi web esistenti. E’ molto utile quando vogliamo inserire un link nei nostri messaggi di twitter per esempio, dove la lunghezza del testo è molto limitata.