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

LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework

Visual Studio has many points to extend and also many ways to do that. We can customize Visual Studio or its plug-ins to gain new functionality, for example creating new code snippets or templates. Macros offer us another simple way to write very simple code—just like we used to do it for Microsoft Office apps—and help ourselves by “macroing” mechanical tasks that otherwise would be repeated manually.

Visual Studio geeks can go further: they can use real managed code to write Visual Studio Add-ins, or become “champions of VS” by creating Visual Studio Integration Packages. For those who prefer managed code there is also a way to encapsulate a so-called Debugger Visualizer into a .NET assembly.

The Drawbacks of so Many Techniques to Extend Visual Studio

While it is a great thing that we can extend Visual Studio at almost every point starting from its menu system through custom tool windows and editors to even our own languages; it is frustrating that we have to use separate techniques—and of course separate runtime libraries with their own semantics.

Customizing Visual Studio is simple, because it generally happens through custom file formats (mainly files with well-defined XML schema) or more and more often through GUIs.

Writing a Visual Studio Add-in requires knowledge about the automation object model above the core VS services, and so, you have to use COM-style programming even if you do it from managed languages.

The most powerful way of creating extensions is undoubtedly using VSPackages. Although Visual Studio SDK offers a so-called Managed Package Framework, in most cases you fall back to use COM interop assemblies to access core VS services.

Today, if you want to rule Visual Studio through extensions, you cannot afford not to speak COM. However, COM is a great technology, .NET offers better ones—and at the end of the day—developer-friendly ones.

In this arguably powerful world of Visual Studio Extensibility there is a great pattern that really works as managed code developers—like me and hopefully you—imagine: you create a simple .NET class library, add a few attributes to a class encapsulating the extension and drop the assembly into a folder to make it work. Debugger Visualizers work on this way.

Visual Studio 2010 Leverages on MEF

Visual Studio 2010 makes this great pattern available for editor extensibility: you create your own extension and drop its assemblies to a folder. When restarting, your new extension will be loaded to Visual Studio and you can immediately use it!

There are several ways to implement this behavior. The architects of Visual Studio editor decided to use the Managed Extensibility Framework (MEF) to carry out this nice work. If you have not heard enough about editor extensibility in Visual Studio 2010, in the previous part of this series you can get a feeling about it. MEF is something independent from Visual Studio 2010, but VS 2010 is one of the first applications when Microsoft uses this technology.

In the remaining part of this article I will give you a brief—and not very technical—overview about MEF.

Getting Started on Managed Extensibility Framework

I know, after such a long introduction you are really curious about what is behind the three letters of MEF. Please stay patient for a minute, the answer comes soon.

What Problem Does MEF Solve?

Managed Extensibility Framework is to solve the old problem of maintaining a piece of statically compiled software that continuously changes—evolves—during its lifetime. If you write package software or enterprise applications you probably experienced by yourself that writing the software—with all mandatory dances like unit and user acceptance testing, documentation, and so on—is generally the easiest and almost the most amusing part.

When it is time to extend—or change—the software, the hard time comes. Even if we do not have problems coming from the architecture, functions changed or added work perfectly, we have to compile and deploy it. Very often it means removing the previous software version from client machines and then installing the new one.

Separating a statically compiled application into smaller physical units (.dlls or assemblies) can help this situation, especially when these smaller units are loaded dynamically. Using some tool for configuration—like a file describing which components to load—and creating a plug-in model definitely would help.

The situation gets more and more complex, if we have several configurations of the application and that should be deployed differently to client machines.

From the efforts point of view, it means that we approximately spend 20% to develop the original application and about 80% to maintain it during the years. If we could turn at least a part of that paining 80% to something more useful—for example inventing into creating better business value or user experience, etc.—both our customers and our company would be happier, and probably we would be better paid. That is where MEF comes into the picture.

What is MEF?

The Managed Extensibility Framework is a new technology that is being shipped as a part of .NET Framework 4.0, and so you do not have to pay for it. Technically MEF is a library that works over the CLR, just like other objects of the Base Class Library or other architecture technologies like WF, WCF and WPF[1]. MEF as a technology is intended to enable greater reuse of applications and components by turning today’s statically compiled applications into dynamically composed ones.

Why is this dynamic composition so important? If you create applications from smaller independent parts, you can architect the app so that responsibilities are better divided. According to these responsibilities you can separately test your parts, find bugs and correct them. It is easier to handle these small parts individually than all pieces together, and—you can imagine—it is easier maintaining them. However, the big issue is how to roll together these individual parts to form a whole application? 

Well, this is what Managed Extensibility Framework does: parts declare their intention to work together with other pieces and MEF pulls all these parts together to form the application. Instead of a monolithic and statically compiled app, we have a dynamically composed one, where we even have the possibility to “drop into” a new part (like inserting a new LEGO brick to an existing composition). The nice thing is that with MEF third parties can easily add new components to our apps and also we can extend third-party apps with our own parts as well. Extending the Visual Studio Editor is actually is this latter one.

Design principles

You can feel that designing an application to be dynamically composed is very different from the ones statically compiled. I would not say it is definitely more difficult or eventually easier, it is simply different. If you have ever used object-oriented principles to design your systems, you will find those especially useful: designing objects, responsibilities and cooperation among them will lead you to composable apps. Of course, it is easy to say, use these principles, but from the point of dynamism we need another principle guiding our way of thinking.

This is the Open/Closed Principle that is credited to Dr. Bertrand Meyer in his 1988 book Object Oriented Software Construction. This principle says that you should create your software entities (components) so that they are open for extensibility, but closed for modifications. We can translate it so that if you create software entities you should create objects so that they possess the opportunity to be extended without changing their source code.

One example of applying this principle is that we create a base class with virtual methods as extensibility points. When it’s time to modify the behavior, we keep the base class untouched and write a derived class overriding the virtual methods.

The reason behind this principle is that modifying the source code of an existing—even tested—component introduces risks with a relatively high mitigation cost. We can introduce new bugs, change the expected logic, or even break existing interfaces. The Open/Closed Principle actually says that we can modify a system by not changing existing code but rather adding new—and of course, individually tested—code.

Of course for applications composed dynamically from smaller parts, this principle suggests creating software components that do not allow changing their source code but allow loading behavior-changing parts.

Challenges

The Open/Closed Principle can be maintained only if our system is properly designed: all extensibility points are identified that can be a subject of changing behavior in their software lifecycle. The smaller the components are, the easier their creation, testing and validation are.

When we statically compile an application we know all the parts of that app, because we have full control over the source code. Even if we use MEF, we can create applications from smaller parts dynamically linked together to compose the whole functionality—nothing prevents us those parts to be in a single and so closed assembly—and having full control over the code. Next time when we modify the app, we simply create new code (for example a new class) for the new behavior that goes into the same assembly. So this time we also have the control of the full application even it is composed from smaller parts.

But, when we allow third party components (parts) to be dynamically composed into our apps, we must face with the fact that there are unknown parts of our app that even have not existed when the app was created. Faulty parts can break down our system, malicious apps can do some other damage.

These issues are not new ones. Even if we use some other kind of dynamic composition or extensibility (for example the plug-in pattern or using dependency injection, IoC containers, etc.) we have the same tasks to solve. The same design techniques that target this kind of issues coming from the fact that our known application code base has to face with some unknown code also work with MEF.

Creating Applications with MEF

We wrapped up a lot of information about the basic principles and approach model of MEF, so it is time to have a closer look at the application creation process. In MEF an application is built of parts:

—  We create parts and declare what are the points where those parts are intend to use other parts; and what are the end points where a part proffers something to be consumed by other parts.

—  Parts that are to form a whole application together are put into a logical place so that MEF will be able to recognize them as the parts of a specific app.

—  MEF uses the information provided by the parts about their intention to merge with other parts and establishes the composition forming the functional app.

To look at a concrete example with some code, let’s assume that we want to organize a programming competition to find the best—fastest or smartest—solution for a managed code Sudoku solver. We create a host application that can accept components from competitors through the ISudokuSolver interface and can pass back the solution in a SudokuState instance. Competitors create an assembly and upload it to a site in order the host application can access them. The blueprint of a component can be something like this:

public class SudokuSolver: ISudokuSolver

{

  public ITracer SolutionTracer { get; set; }

 

  public SudokuState GetSolution(SudokuState initialState)

  {

    // ...

  }

}

As an expectation from the competitors each component must provide a way to trace its internal implementation through an ITracer instance.

How would you implement the binding between the host application and a solver component? You have many ways how to dynamically load an assembly and instantiate a type within (or other techniques), but this time we focus on how MEF helps you.

As we have just treated above, the first step is to express the intention that we want to publish the SudokuSolver class to the world. We sign it with the Export attribute:

[Export(typeof(ISudokuSolver))]

public class SudokuSolver: ISudokuSolver

{

  public ITracer SolutionTracer { get; set; }

 

  public SudokuState GetSolution(SudokuState initialState)

  {

    // ...

  }

}

The argument of the Export attribute signs the contract our solver implements. While our solver does its job, it sends trace information to the host application by consuming an ITracer, whatever is provided by the host. This intention is expressed by the Import attribute:

[Export(typeof(ISudokuSolver))]

public class SudokuSolver: ISudokuSolver

{

  [Import]

  public ITracer SolutionTracer { get; set; }

 

  public SudokuState GetSolution(SudokuState initialState)

  {

    // ...

  }

}

The Import attribute has no arguments; MEF infers the type of contract (type of service to be used) from the type of the property decorated by the attribute.

The host application has two types also decorated with Export and Import attributes, something like these:

[Export(typeo(ITracer))]

public class HostTracer: ITracer { ... }

 

public class SolverRunner

{

  [Import]

  ISudokuSolver SolverIntance;

  // ...

}

By these decorations the host app provides an ITracer implementation for parts interested in and is ready to accept ISudokuSolver instances proffered by parts.

When we upload our solver component into a folder where the host application is looking for, that is ready to be composed with the host.

MEF uses runtime composition to allow parts wanting to work together make their bindings. There are two important concepts determining how this composition is carried out:

—  Catalogs. A Catalog is a collection of parts that are to build up the application. When MEF does the runtime composition, it looks up the catalog for parts. In our case the host application probably uses a so-called DirectoryCatalog that is bound to the folder containing the uploaded solvers.

—  Composition Containers. Once we have the catalog containing parts, we need a matchmaker that binds parts (using the Export and Import declarations and many other aspects). This is done by so-called composition containers.

The runtime composition is initiated by the host application using MEF. Imagine that we are going to create a WPF application. In this apps initialization code we create the catalog and a composition container using this catalog with two lines of code like this:

var catalog = new DirectoryCatalog("catalog folder name", ...);

var container = new CompositionContainer(catalog, ...);

When it is time to use the solver part, the host app simply asks the composition container to provide the instance represented by ISudokuSolver:

var solver = container.GetExportedObject<ISudokuSolver>();

From this point of time we can use the solver instance just like as if it were statically compiled with the host application, however, our application is dynamically composed from the host app and the extending solver component.

Where are we?

We have seen that MEF provides a new and easy way to extend the Visual Studio editor compared to the extension mechanism we had in VS before. MEF is a new technology that is a part of the forthcoming .NET framework 4.0. It enables turning statically compiled applications into dynamically composed ones.

Next time we will dive deeper into code to get more information about MEF.



[1] Yes, I call these parts of the framework „architecture technologies”. You may say it is not correct, “libraries” or simply “technologies” paint the concept better. However, my experiences show that the audience likes this term.


Posted May 26 2009, 08:10 AM by inovak
Filed under: , ,

Comments

DiveDeeper's blog wrote LearnVSXNow! Part #44 – “Hello World” of MEF
on Thu, May 28 2009 8:08

In the previous part of the series I gave you a very brief overview of the Managed Extensibility Framework

north face clearance wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Nov 10 2012 2:59

Hi, I think your website might be having browser compatibility issues. When I look at your blog site in Chrome, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, great blog!

http://bestmedicineonline.info wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Feb 15 2013 19:28

VCH55O Thanks for sharing, this is a fantastic blog article. Will read on...

buy viagra wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sun, Feb 17 2013 10:50

Thanks a lot for the article post. Fantastic.

buy stendra cheap wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Mon, Feb 18 2013 2:56

Really appreciate you sharing this blog article. Fantastic.

buy clomid no prescription wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 19 2013 4:11

Thanks-a-mundo for the blog post. Fantastic.

slim fast pills wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 20 2013 22:14

Thanks-a-mundo for the blog post. Keep writing.

lose weight fast pills wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 21 2013 5:09

I loved your post.Really thank you!

Pay Per Click wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sun, Feb 24 2013 22:34

A round of applause for your article post.Much thanks again. Want more.

survivalgear wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 14:40

It's then paired with a wide variety being sold in stores and second, so we could relax and nap because were changing rooms again for our next trip, or larger than the traditional campfire.  <a href="http://survival-gear.info" title="camping gear">camping gear</a>

get more twitter followers fast wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 19:43

Thanks again for the post. Fantastic.

tips to make hair grow faster wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 21:25

Great article.Really looking forward to read more. Want more.

seo packages wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 22:46

Im obliged for the article.Much thanks again. Awesome.

complete surveys for cash wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 23:03

Major thanks for the blog.Thanks Again. Cool.

What is a Domain Name wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Tue, Feb 26 2013 23:29

Thanks for the blog article.Really looking forward to read more. Much obliged.

instagram search user name wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 0:38

Im thankful for the article post.Really looking forward to read more. Fantastic.

Security Cameras wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 0:38

I cannot thank you enough for the blog article.Really looking forward to read more. Really Great.

colonie de vacances wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 1:21

Really enjoyed this blog article.Really looking forward to read more. Keep writing.

empregos rj wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 2:13

Awesome blog post.Really thank you! Keep writing.

instagram followers check wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 2:30

Thanks-a-mundo for the blog article.Much thanks again. Want more.

Buying and selling properties wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 3:51

Enjoyed every bit of your blog post. Fantastic.

kim kardashian sekstape wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 4:23

Im obliged for the blog post.Really looking forward to read more. Want more.

Kim Kardashian sextape wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 5:07

Enjoyed every bit of your blog post.Really thank you! Great.

trick photo wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 5:29

Thanks again for the blog post.Really looking forward to read more. Awesome.

buy active instagram followers wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 6:17

Appreciate you sharing, great blog.Really thank you! Much obliged.

woman asian wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 7:02

Thanks so much for the article post.Much thanks again.

marketing financial advisors wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 7:08

Im obliged for the blog post. Cool.

how to get likes on instagram yahoo wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 8:12

Awesome article.Really looking forward to read more. Really Cool.

cheap nikon d3100 lenses wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 8:47

Thanks-a-mundo for the blog. Really Great.

woodworking bench plans wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 8:59

Appreciate you sharing, great post. Great.

group travel wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 10:10

I really enjoy the blog post.Thanks Again. Fantastic.

what is gyro meat wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 10:27

Great, thanks for sharing this post.Really thank you! Want more.

buy real instagram followers wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 10:56

This is one awesome article.

tour packages wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 12:05

Awesome article.Really thank you! Much obliged.

facebook photo likes wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 12:07

Fantastic blog.Thanks Again. Want more.

Mobile service wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 12:51

wow, awesome blog.Much thanks again. Really Great.

instant payday network wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 14:00

Wow, great blog post. Really Great.

agen bola wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 14:46

Thanks-a-mundo for the article.Really thank you!

Dallas roofing wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 15:55

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

SEO wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 17:50

I appreciate you sharing this article.Much thanks again. Will read on...

mobile phone codes wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 18:37

Thank you for your blog article.Thanks Again. Want more.

oil paintings sale online wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 19:48

Major thankies for the article.Much thanks again. Really Cool.

how to be a personal assistant wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 21:47

Very neat blog article.Really thank you!

pianists nyc wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 22:39

A big thank you for your blog.Really looking forward to read more. Will read on...

Emily Arrowood wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Wed, Feb 27 2013 23:47

Great, thanks for sharing this blog.Much thanks again.

ginny simon wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 1:47

Hey, thanks for the article post.Much thanks again. Really Cool.

Crysis 3 download wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 3:48

Very informative blog post. Really Cool.

Kirkland Locksmith wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 5:49

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

barrel sauna wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 7:50

Appreciate you sharing, great blog post.Really looking forward to read more. Will read on...

speaker wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 9:51

I cannot thank you enough for the post.Really thank you! Cool.

Vpn wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 20:40

wow, awesome blog.Really thank you!

buy clomid no prescription wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 22:13

QYwPny I truly appreciate this article post.Really thank you! Will read on...

ourmeds wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Thu, Feb 28 2013 22:16

I appreciate you sharing this post. Want more.

GeForce GTX 690 wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 12:41

Major thankies for the blog article.Really thank you! Really Cool.

escorts wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 14:17

Thank you ever so for you blog. Much obliged.

foc de artificii wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 14:31

Fantastic article post. Awesome.

adjustable dumbbells wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 15:53

Say, you got a nice blog.Really thank you! Awesome.

wordpress video tutorials wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 17:23

Im grateful for the article post.Really looking forward to read more. Great.

social bookmarking wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 17:25

Fantastic article post.Really looking forward to read more. Will read on...

daily steals wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 17:28

Thanks a lot for the blog post.Really looking forward to read more. Fantastic.

make money online wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 19:04

I cannot thank you enough for the article post.Really thank you! Will read on...

dublin visitor card wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 19:08

Fantastic post.Thanks Again. Want more.

how to light video wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 19:31

Thanks for sharing, this is a fantastic blog.Much thanks again. Great.

ekg blog wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 20:53

I really like and appreciate your blog. Really Great.

youtube wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 22:17

Muchos Gracias for your blog. Keep writing.

Ferienwohnung cuxhaven wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 22:36

I loved your article post.Much thanks again. Cool.

follow his adventure wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Fri, Mar 1 2013 23:40

Im thankful for the blog post.Thanks Again. Fantastic.

halovar wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 0:19

Looking forward to reading more. Great blog article. Great.

Riu Hotels Special wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 0:22

Im thankful for the blog.Thanks Again. Cool.

funny blog wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 1:47

Really informative article post. Keep writing.

oxyelite pro wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 2:03

Great, thanks for sharing this article.Really thank you! Much obliged.

seo link wheel wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 2:28

Very good blog post. Great.

lipo 6 wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 3:46

Major thanks for the blog post.Really thank you! Really Cool.

pharmacy wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 4:31

Thanks again for the post. Really Great.

create a blog wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 5:30

Awesome post.Really looking forward to read more. Fantastic.

kitchens wimlsow wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 6:34

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

cheap auto insurance wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 7:14

I think this is a real great post. Much obliged.

Digital camera photo recovery wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 8:38

Awesome article post.Much thanks again.

Same Day Payday Loan wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 8:58

Major thanks for the post.Really looking forward to read more. Fantastic.

die cutting wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 10:44

Really enjoyed this article. Want more.

seo services adelaide wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 10:45

Really appreciate you sharing this blog post. Fantastic.

kim kardashian sex tape wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 12:14

Great blog article.Thanks Again. Really Cool.

gold buyers wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 12:33

Wow, great article post.Much thanks again. Awesome.

Get Twitter followers wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 13:13

Enjoyed every bit of your blog.Thanks Again. Really Cool.

green coffee bean diet wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 14:19

Im thankful for the blog article.Really thank you! Cool.

instagram app for ipad wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 14:20

Thank you for your article post.Really thank you! Will read on...

Business Domain Names wrote re: LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework
on Sat, Mar 2 2013 14:50

Looking forward to reading more. Great blog post.Really looking forward to read more. Awesome.

BUY GoPro HERO4 SILVER AT AMAZON HERE wrote BUY GoPro HERO4 SILVER AT AMAZON HERE
on Wed, Nov 26 2014 8:21

LearnVSXNow! Part #43 – Introducing the Managed Extensibility Framework - DiveDeeper's blog - Dotneteers.net