Dotneteers.net
All for .net, .net for all!

LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework

 

In the previous part of the series I gave you a very brief overview of the Managed Extensibility Framework and about how it is used by the editor extensibility in Visual Studio 2010. As an extensibility guy, I am interested in writing new extensions for the editor, and because it is built on MEF, I think it is worth getting familiar with MEF concepts and their application.

If you want to get more detailed information about MEF, you should visit the MEF Homepage. I really like MEF and all the information collected on this page, but I really miss information that helps with positioning MEF in order developers can put it into their everyday toolset and small applications demonstrating the basic concepts.

However, I’ve seen a very good presentation at TechEd 2009 North America from Jason Olson about MEF that helped me a lot in understanding the basics. Unfortunately, the video is available only for registered attendees…

In this article I am going to create some very basic applications using MEF—this is where the title comes from J—and treat the details in order you can get familiar with the concepts.

The Greetings Sample

Let’s start our first tour with a simple console application—an “advanced” version of the “Hello World” application where the greeting text is decoupled from the console application class outputting it. This application is simple, and this time we do not use MEF yet:

// --- Program.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace GreetingsWithMEF

{

  class Program

  {

    static void Main(string[] args)

    {

      var greetings = new SimpleGreeting();

      Console.WriteLine(greetings.SayHello());

    }

  }

}

 

// --- IGreetings.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace GreetingsWithMEF

{

  interface IGreetings

  {

    string SayHello();

  }

}

 

// --- SimpleGreeting.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace GreetingsWithMEF

{

  class SimpleGreeting : IGreetings

  {

    public string SayHello()

    {

      return "Hello from Visual Studio 2010";

    }

  }

}

Although, the greeting text is decoupled from the console class through the IGreetings interface, we directly instantiate the SimpleGreeting class, so we cannot speak about a loosely-coupled implementation. Now, let us turn this console application to a “MEFish” one.

MEF and composition

The first step we have to do is adding a reference to the System.ComponentModel.Composition assembly that holds the MEF types we are going to use. Now we can separate the greeting component from the console class in four steps:

—  Step 1: Decorate the SimpleGreeting class with the Export attribute

—  Step 2: Declare a catalog to search the application parts in

—  Step 3: Create a composition container using the catalog

—  Step 4: Query the part represented by IGreetings from the composition container

The resulting application looks like this; I highlighted the most important changes:

// --- IGreeting.cs: Nothing changed

// --- SimpleGreeting.cs:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel.Composition;

 

namespace GreetingsWithMEF

{

  [Export(typeof(IGreetings))]  // --- Step 1

  class SimpleGreeting : IGreetings

  {

    public string SayHello()

    {

      return "Hello from Visual Studio 2010";

    }

  }

}

 

// --- Program.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Reflection;

using System.ComponentModel.Composition.Hosting;

 

namespace GreetingsWithMEF

{

  class Program

  {

    static void Main(string[] args)

    {

      // --- Step 2

      var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

      // --- Step 3

      var container = new CompositionContainer(catalog);

      // --- Step 4

      var greetings = container.GetExportedObject<IGreetings>();

      Console.WriteLine(greetings.SayHello());

    }

  }

}

When you run this code by Ctrl+F5 it displays the expected greeting message. You can see from the sample that here we do not directly instantiate the SimpleGreeting type, we even do not use its name!

The type of catalog is AssemblyCatalog that scans through an assembly—in our case—the console application assembly to find all parts in the catalog. This time we have only one part, the SimpleGreeting part. The composition container is the matchmaker that uses the specified catalog to bind parts with each other and the hosting app as required. In this case we have only one part in this catalog, but we could have more.

The little cogs of the composition container start spinning up when we call the GetExportedObject<IGreetings> method that makes all the matches among the parts in the composition container’s catalog and retrieves an instance of the part we request—this time a part exporting the IGreetings contract. Of course this time the composition container does not have to invest too much work into matchmaking, because we have only one part in the catalog. However, do not underrate the role of the container, because in case of many parts it has a really hard job!

Playing with the contract

One of the core concepts of MEF is the contract that has the same semantics as generally used in object-oriented design or in WCF or in distributed systems. In MEF the contract is the binding link between a part proffering a (service) end-point and a part requesting an end-point. In is obvious that the composition process is based on contracts: this is the core concepts used when making the match among parts.

To get a feeling about contracts and their usage in MEF, let’s play with them. Just to make something crazy, change the Export attribute of the SimpleGreeting class to System.Int32:

[Export(typeof(System.Int32))]

class SimpleGreeting : IGreetings { ... }

Now, when trying to run this little app, you will get an ImportCardinalityMismatchException with the following message: “No exports were found that match the constraint '((exportDefinition.ContractName == "GreetingsWithMEF.IGreetings") AndAlso …

What this message says is—actually it tells much more—that our composition container was unable to find a part with the IGreetings contract we have used in the GetExportedObject<IGreetings> call. This is natural, because we changed the contract type of our SimpleGreeting class to System.Int32 and even if this class implements IGreetings, not this is the way to match parts.

In the sample above we identified the contract with a type. MEF uses strings to identify contracts. The composition engine uses this string and a so-called type identity when binding parts. So let’s temporarily add a new class called AnotherSimpleGreeting to the console application and let’s change the Export attributes like this:

[Export("FirstContract", typeof(IGreetings))]

class SimpleGreeting : IGreetings

{

  public string SayHello()

  {

    return "Hello from Visual Studio 2010";

  }

}

 

[Export("SecondContract", typeof(IGreetings))]

class AnotherSimpleGreeting : IGreetings

{

  public string SayHello()

  {

    return "Another Hello from Visual Studio 2010";

  }

}

Now, we have two parts using the IGreetings type identifier in the contracts with names “FirstContract” and “SecondContract”. We can tell the composition engine which contract to use by naming it explicitly:

var greetings = container.GetExportedObject<IGreetings>("SecondContract");

This time when you run the sample you can recognize that the AnotherSimpleGreeting part gets bound to the host application. I know, at this point you may have questions emerging about how the composition engine works and how contracts are exactly identified. In this article we won’t treat these details, but be patient, in a future article I definitely will handle these questions.

One small remark: I have told you that the GetExportedObject call spins up the composition engine; this is where matchmaking is done to bind together the host app with the appropriate parts. From this sample where we have two contract, it can be seen that matchmaking really happens this time and not at the time when the composition container is created. While GetExportedObject is not called, the host application does not declare the contract to be used for binding.

Now, let’s add some salt to the soup! Remove the strings from the Export attributes and use only the types to set up the definition; and also remove the string parameter from the GetExportedObject call. This time we have two parts satisfying the IGreetings contract. The container cannot select the one we are looking for and throws an ImportCardinalityMismatchException with the following message: “More than one exports were found that match the constraint '((exportDefinition.ContractName == "GreetingsWithMEF.IGreetings") AndAlso …”.

I’m sure you are not surprised. The message tells just like what you would have said.

Parts Accessing Host Application End-points

Undoubtedly the sample we have seen is really simple: a host application loads independent parts at runtime and consumes services. In the real life generally parts also can access the host application’s endpoints and consume their services. So, let’s see how we can do this with MEF!

Let’s change the configuration so that our greeting component can ask the host application for context information defined by the following contract type:

// --- IContextInfo.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace GreetingsWithMEF

{

  public interface IContextInfo

  {

    IDictionary<string, string> GetContextInfo();

  }

}

The GetContextInfo method will provide a dictionary of key and value pairs where—just for simplicity—keys and values are both strings. Let’s create a type named UserInfo that implements this contract, and mark it with the Export attribute:

// --- UserInfo.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel.Composition;

 

namespace GreetingsWithMEF

{

  [Export(typeof(IContextInfo))]

  class UserInfo: IContextInfo

  {

    public IDictionary<string, string> GetContextInfo()

    {

      return new Dictionary<string, string>

        { {"UserName", Environment.UserName } };

    }

  }

}

 We change the declaration of SimpleGreeting so that now it will include a property that Imports the IContextInfo contract, and we change the SayHello method to use that contract:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel.Composition;

 

namespace GreetingsWithMEF

{

  [Export(typeof(IGreetings))]  // --- Step 1

  class SimpleGreeting : IGreetings

  {

    [Import(typeof(IContextInfo))]

    IContextInfo ContextInfo { get; set; }

 

    public string SayHello()

    {

      string userName;

      var props = ContextInfo.GetContextInfo();

      props.TryGetValue("UserName", out userName);

      return "Hello " + (userName ?? "<null>") + " from Visual Studio 2010";

    }

  }

}

The Main method of our application remains the same:

static void Main(string[] args)

{

  var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

  var container = new CompositionContainer(catalog);

  var greetings = container.GetExportedObject<IGreetings>();

  Console.WriteLine(greetings.SayHello());

}

When you run the app, it will work as expected! So what is going behind the scenes? Actually, nothing new happens compared to the previous runs. When the GetExportedObject method is called it instantiates the appropriate IGreetings-implementing type. The composition container recognizes that SimpleGreeting wants to access a part with the IContextInfo contract. The container sees that UserInfo is the only type implementing this and constructs a UserInfo instance, sets the SimpleGreeting instance’s ContextInfo property to this newly constructed one. Now, the SimpleGreeting instance is set up and so it is passed back to the host application for consumption.

Where are we?

In this article we have seen a very simple example of using MEF to dynamically compose a simple application from a host and a one or two parts. This composition is based on contracts. Parts can declare themselves as end-point providers for the contract (Export attribute) or sign that they require parts with the contract (Import attribute). MEF uses catalogs to enumerate all candidate parts contributing in an application. The composition process is carried out by so-called composition containers.


Posted May 28 2009, 08:07 AM by inovak
Filed under: , ,

Comments

Mihai wrote re: LearnVSXNow! Part #44 – “Hello World” of MEF
on Thu, May 28 2009 9:57

It would be nice to not have to use MEF, and use another IoC/DI framework instead, but I guess that if I dig a bit through MEF docs I'll find a way of configuring it manually :P

inovak wrote re: LearnVSXNow! Part #44 – “Hello World” of MEF
on Thu, May 28 2009 10:14

Write me, if you have found something, I am really interested in :-)

SKOROZSI.NET wrote links for 2009-05-28
on Thu, May 28 2009 23:02

links for 2009-05-28

codediscuss wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Mon, Jun 8 2009 2:15

So in your example, the host and the extension are in the same assembly?

inovak wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Mon, Jun 8 2009 7:02

Yes, in the sample for the sake of simplicity the extensions are in the same assembly as the host. However, by changing the catalog it is very simple to use external assemblies for extension.

harsha wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Jun 12 2009 10:14

Thanks for keeping it so simple yet so informative.

buy imitrex wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 14 2013 21:44

geS4bY Thanks a lot for the blog article.Really looking forward to read more. Really Great.

get get more followers twitter wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Tue, Feb 26 2013 19:05

Looking forward to reading more. Great blog article.Really thank you! Fantastic.

what makes hair grow faster wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Tue, Feb 26 2013 20:44

Thanks a lot for the blog post.Thanks Again. Really Cool.

stay at home parents wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Tue, Feb 26 2013 22:26

Appreciate you sharing, great article.Really looking forward to read more. Really Great.

What is a Domain Name wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Tue, Feb 26 2013 22:48

Very informative article.Thanks Again. Will read on...

clear instagram search wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Tue, Feb 26 2013 23:58

Very neat article.Thanks Again. Great.

Digital Cameras and Camcorders wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 0:02

Very good blog. Want more.

colonie de vacances wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 0:42

Enjoyed every bit of your article post.Thanks Again. Will read on...

empregos rj wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 1:37

Say, you got a nice article post. Awesome.

buy instagram followers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 1:49

Im thankful for the blog.Really thank you! Really Great.

empower network program wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 2:33

Im thankful for the article post.Really thank you! Awesome.

real estate services wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 3:13

Thanks so much for the article.Really thank you! Really Great.

kim kardashian s butt wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 3:42

Fantastic blog post.Thanks Again. Really Great.

Kim Kardashian wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 4:26

Great, thanks for sharing this blog post.Really thank you! Keep writing.

trick photography wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 4:55

Say, you got a nice blog post.Really looking forward to read more. Really Cool.

real instagram followers for sale wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 5:36

Im grateful for the article.Really thank you! Much obliged.

russian girls wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 6:21

Very neat post. Cool.

get more customers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 6:31

A big thank you for your blog.Really thank you! Really Cool.

cheap nikon d3100 lenses wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 8:12

Very good article.Really thank you! Keep writing.

wood working plans wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 8:17

I value the post. Want more.

flights wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 9:28

Looking forward to reading more. Great blog article.Thanks Again. Will read on...

idaniko varos wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 9:49

Thanks so much for the blog article. Will read on...

buy real instagram followers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 10:15

I cannot thank you enough for the blog post.Much thanks again. Really Great.

kerala houseboats wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 11:24

Great blog article. Cool.

facebook photo likes wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 11:29

A round of applause for your blog article.Really thank you! Much obliged.

Cell phone plans wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 12:10

Awesome blog. Keep writing.

money making ideas wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 13:19

Fantastic post.Thanks Again. Really Great.

Viral List Crusher scam wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 16:00

Thanks a lot for the blog post.Thanks Again. Awesome.

Multilingual SEO expert wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 17:09

Thanks for sharing, this is a fantastic blog article. Keep writing.

shares in a race horse wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 19:53

Very good blog.Really thank you! Much obliged.

pianists new york wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Wed, Feb 27 2013 21:55

I am so grateful for your blog post. Fantastic.

http://clomidnoprescription.beep.com/ wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 28 2013 0:05

lZWDsX Very neat blog post.Much thanks again. Keep writing.

ginny simon wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 28 2013 1:04

Im obliged for the blog article.Thanks Again. Much obliged.

wooden hot tubs wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 28 2013 7:06

I truly appreciate this blog.Really looking forward to read more. Want more.

Vpn wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 28 2013 20:04

Im obliged for the article post.Really thank you! Want more.

ourmeds wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Thu, Feb 28 2013 21:41

Really appreciate you sharing this blog post. Fantastic.

atlasjet ucak bileti|atlasjet ucak bileti wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 11:42

Thanks for sharing, this is a fantastic article.Thanks Again. Cool.

GeForce GTX 690 wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 12:06

I loved your blog article.Much thanks again. Awesome.

schweizer sex treff wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 12:33

Wow, great article.Really looking forward to read more. Great.

escort agency wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 13:45

Really informative blog article. Much obliged.

spectacole pirotehnice wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 13:46

Looking forward to reading more. Great blog article.Really thank you! Will read on...

fine art prints wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 14:36

Im thankful for the article post.Much thanks again. Really Cool.

adjustable dumbbell review wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 15:19

Muchos Gracias for your article.Really thank you! Really Great.

social bookmarking wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 16:41

Really informative article post.Really thank you! Keep writing.

how to start a blog wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 16:42

I value the blog post. Fantastic.

amazing steals wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 16:53

I think this is a real great article post.Thanks Again. Want more.

dublin discount card wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 18:28

Thanks for sharing, this is a fantastic article post.Really thank you! Great.

make money online wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 18:28

Say, you got a nice article. Really Great.

how to light video wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 18:45

Thanks so much for the article. Great.

watch here wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 21:32

Wow, great blog.Really thank you! Keep writing.

Ferienwohnung cuxhaven wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 21:57

I appreciate you sharing this article post. Fantastic.

experience Peru wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 22:55

I think this is a real great article post.Much thanks again. Really Cool.

Bacelo Hotels reservation wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 23:36

Wow, great blog article. Much obliged.

halovar wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Fri, Mar 1 2013 23:39

Major thanks for the blog.Much thanks again.

he knows women wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 1:01

Wow, great article.Really looking forward to read more.

oxyelite pro wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 1:27

Muchos Gracias for your post.Really thank you! Fantastic.

seo link wheelers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 1:42

I truly appreciate this blog.Really looking forward to read more. Much obliged.

lipo 6 wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 3:07

A big thank you for your blog article.Much thanks again. Awesome.

japanese wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 3:08

Very informative blog article.Really thank you! Keep writing.

fertility pharmacy wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 3:47

I appreciate you sharing this article.Thanks Again. Great.

make your own website wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 4:50

Thanks-a-mundo for the blog post.Really looking forward to read more.

kitchens manchetser wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 5:49

Thanks a lot for the article. Much obliged.

cheap auto insurance wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 6:35

Wow, great article.Really thank you! Much obliged.

Social Bookmarking wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 7:15

Thank you for your blog post.Much thanks again. Really Great.

Digital camera image recovery wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 7:53

Thank you for your article post.Thanks Again. Fantastic.

90 Day Payday Loans wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 8:19

I really liked your blog.Thanks Again. Will read on...

die cut machine wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 9:59

Say, you got a nice blog.Thanks Again. Awesome.

gold buyers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 11:52

Muchos Gracias for your article. Awesome.

Get Twitter followers wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 12:37

Im obliged for the blog article.Much thanks again. Really Great.

olympus camera wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 13:35

Wow, great post.Really looking forward to read more. Really Great.

where to buy green coffee beans wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 13:38

Appreciate you sharing, great article.Really looking forward to read more. Fantastic.

Buying Domain Name wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 14:14

Muchos Gracias for your blog post.Really looking forward to read more. Much obliged.

guitar online wrote re: LearnVSXNow! Part #44 – “Hello World” of Managed Extensibility Framework
on Sat, Mar 2 2013 15:52

Really enjoyed this article post.Really looking forward to read more. Cool.