<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Akezyt on MSDN</title><link>http://blogs.msdn.com/akezyt/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Moving to Thailand</title><link>http://blogs.msdn.com/akezyt/archive/2008/05/17/moving-on-to-thailand.aspx</link><pubDate>Sat, 17 May 2008 17:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8743951</guid><dc:creator>Akezyt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/8743951.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=8743951</wfw:commentRss><description>As some of you might already know, I will be moving toThailand to join Health Solutions Group team. It was a great pleasure working with CRM team and I will continue to be CRM's biggest fan. Please let me know if&amp;nbsp; you have question about CRM and/or my previous blog posts.&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8743951" width="1" height="1"&gt;</description></item><item><title>Debugging Plug-in</title><link>http://blogs.msdn.com/akezyt/archive/2008/05/07/debugging-plug-in.aspx</link><pubDate>Wed, 07 May 2008 04:38:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8464472</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/8464472.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=8464472</wfw:commentRss><description>&lt;p&gt;During MSCRM plug-in development, developer would want to test his/her plug-in before putting in production server to make sure it works as designed. One way to do it is to have a development environment to test plug-in. However, the turn around time between deploy-test-debug-build-deploy is very significant even putting plug-in on disk. It would be nice if we can test plug-in locally without deploying it on CRM server. The approach I am going to show is to execute plug-in in a small EXE container. Since IPluginExecutionContext is just interface, we can mock the context in our test container. Effectively, you will be able to rapidly develop/test/debug plug-in without ever leaving Visual Studio until you are ready. &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/DebuggingPlugin_105D3/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="425" alt="image" src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/DebuggingPlugin_105D3/image_thumb.png" width="550" border="0"&gt;&lt;/a&gt;  &lt;p&gt;I created a sample solution containing a simple test context and a test plug-in on code.msdn (&lt;a title="http://code.msdn.microsoft.com/MSCRMPluginDebugger" href="http://code.msdn.microsoft.com/MSCRMPluginDebugger"&gt;http://code.msdn.microsoft.com/MSCRMPluginDebugger&lt;/a&gt;). This sample shows you how to populate relevant input parameters and how to create CrmService behind context. You might need to add more implementation to TestContext to suite your need but this sample should be a foundation you can build on for example pre/post image or MetadataService. &lt;p&gt;Developer can use this approach for both debugging during development or for writing unit test. It would enable ISV to write unit test and run it from test harness/framework such as one provided by TFS. &lt;p&gt;Even though mocking IPluginExecutionContext can emulate container that plug-in will execute in, it is only approximation. Other differences can still make running in production different from test context, for example: &lt;p&gt;- Security context. CRM runs plug-in in service account (usually network service). Test contain runs plug-in in currently logged in user context. Files/registries may be accessible from log in user but service account may not , and vice versa. &lt;p&gt;- HttpContext. Accessing HttpContext.Current is not recommended. If you need something that is available only HttpContext.Current, please let us know. Ideally, plug-in should be able to get everything from IPluginExecutionContext. &lt;p&gt;NOTE: Depending on currently logged in user, you may or may not be able to impersonate a particular user. Only AD user in PrivUserGroup can impersonate other user in CRM. &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8464472" width="1" height="1"&gt;</description></item><item><title>CRM plug-in registration tools</title><link>http://blogs.msdn.com/akezyt/archive/2008/02/13/crm-plug-in-registration-tools.aspx</link><pubDate>Wed, 13 Feb 2008 09:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7665832</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/7665832.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=7665832</wfw:commentRss><description>&lt;P&gt;Ajith and friends had posted article about plug-in registration tools on CRM blog (&lt;A href="http://blogs.msdn.com/crm/archive/2008/02/04/crm-registering-plug-ins-made-easy.aspx"&gt;http://blogs.msdn.com/crm/archive/2008/02/04/crm-registering-plug-ins-made-easy.aspx&lt;/A&gt;). Ajith is our tester on plug-in framework so he knows the ins and outs of plug-ins. This tools should make plug-in developer's life much easier.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7665832" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/CRM/default.aspx">CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Plug-in/default.aspx">Plug-in</category></item><item><title>Microsoft Dynamics CRM 4.0 Ready for Download.</title><link>http://blogs.msdn.com/akezyt/archive/2007/12/19/microsoft-dynamics-crm-4-0-ready-for-download.aspx</link><pubDate>Wed, 19 Dec 2007 05:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6801697</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/6801697.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=6801697</wfw:commentRss><description>&lt;P&gt;After 2 years in the making, now CRM 4.0 is ready to roll.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Microsoft announced Monday that it has released to manufacturing the long-awaited update to its Dynamics-branded customer relationship management software (CRM). 
&lt;P&gt;Previously codenamed "Titan," the latest version of Microsoft Dynamics CRM actually has two names in its final form. For on-premise, customer-hosted, as well as partner-hosted deployments, the product has been dubbed Dynamics CRM 4.0. The company will also be offering the package on-demand in a Microsoft-hosted environment that it has named Dynamics CRM Live. &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;From: &lt;A href="http://www.internetnews.com/ent-news/article.php/3717151" mce_href="http://www.internetnews.com/ent-news/article.php/3717151"&gt;Internewnews&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6801697" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/CRM/default.aspx">CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>CRM Plug-in that exposes explicit method for each event.</title><link>http://blogs.msdn.com/akezyt/archive/2007/11/27/crm-plug-in-that-expose-easy-precreate-postcreate-v3-style-interface.aspx</link><pubDate>Tue, 27 Nov 2007 09:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6544020</guid><dc:creator>Akezyt</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/6544020.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=6544020</wfw:commentRss><description>&lt;P&gt;Eventing framework in CRM v4.0 is designed from the ground up to be generic not just for Create,Update,Delete messages. As a result, IPlugin interface exposes only one generic Execute method. This allow CRM to support a large number of events without exploding the interface. The drawback is, this leave a considerably large gap between generic developer-focused infrastructure and specific business-oriented usage case.&lt;/P&gt;
&lt;P&gt;However, a thin layer of wrapper can be created to wrap generic Execute and extract relevant input and output parameters. This sample covers only Create, Update, Delete, Assign, and SetState. However, some other events such as Send, Deliver, or Route can be easily added with the same pattern.&lt;/P&gt;
&lt;P&gt;To use it, developers can create new plug-in (e.g. MyPlugin) by&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Adding ExplicitPlugin.cs to their plug-in project. 
&lt;LI&gt;Deriving MyPlugin from ExplicitPlugin. 
&lt;LI&gt;Override methods that are relevant to your project&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;In addition to the part that expose PreCreate/PostCreate style methods, this code sample also shows how to generically access primary key of an entity inside DynamicEntity without using metadata. This can be useful when you don't have access to metadata.&lt;/P&gt;
&lt;P&gt;I tested it on some messages so please let me know if there are some problems so I can update it.&lt;/P&gt;
&lt;P&gt;As usual, this code is provided as-is....&lt;/P&gt;
&lt;P&gt;MyPlugin.cs &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Text;&lt;BR&gt;using Microsoft.Crm.Sdk; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;namespace MyPluginProject&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MyPlugin : ExplicitPluginBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PreCreate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PostCreate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PreUpdate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PostUpdate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PreDelete(Moniker moniker, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PostDelete(Moniker moniker, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PreAssign(Moniker moniker, SecurityPrincipal assignee, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PostAssign(Moniker moniker, SecurityPrincipal assignee, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PreSetState(Moniker moniker, ref string state, ref int status, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void PostSetState(Moniker moniker, string state, int status, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void CreateTask(Moniker moniker, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateTask(moniker, null, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void CreateTask(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICrmService service = context.CreateCrmService(true); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DynamicEntity task = new DynamicEntity("task");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string prefix = "pre";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (context.Stage == MessageProcessingStage.AfterMainOperationOutsideTransaction)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prefix = "post";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid id = Guid.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (moniker != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = moniker.Id;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; task["subject"] = prefix + " - " + context.MessageName + " : " + id.ToString(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (entity != null&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; entity.Properties.Contains("firstname"))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; task["description"] = entity["firstname"];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; service.Create(task);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ExplicitPluginBase.cs&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.Globalization; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using Microsoft.Crm.Sdk; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;namespace MyPluginProject&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract class ExplicitPluginBase : IPlugin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Execute(IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AdapterBase adapter = CreateConcreteAdapter(context); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (adapter != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (context.Stage == MessageProcessingStage.BeforeMainOperationOutsideTransaction)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adapter.ExecutePre(this, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adapter.ExecutePost(this, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExecuteGeneric(context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private AdapterBase CreateConcreteAdapter(IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (context.MessageName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.Assign:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new AssignAdapter(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.Create:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new CreateAdapter(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.Update:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new UpdateAdapter(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.Delete:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new DeleteAdapter(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.SetState:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case MessageName.SetStateDynamicEntity:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new SetStateAdapter(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PreCreate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PostCreate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PreUpdate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PostUpdate(Moniker moniker, DynamicEntity entity, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PreDelete(Moniker moniker, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PostDelete(Moniker moniker, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PreAssign(Moniker moniker, SecurityPrincipal assignee, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PostAssign(Moniker moniker, SecurityPrincipal assignee, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PreSetState(Moniker moniker, ref string state, ref int status, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void PostSetState(Moniker moniker, string state, int status, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowNotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void ExecuteGeneric(IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Exception("The method or operation is not implemented.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Implementation details &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void ThrowNotImplementedException()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // throw new NotImplementedException(string.Format(CultureInfo.InvariantCulture, "{0} is not implemented.", methodName));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private abstract class AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Moniker GetEntityMoniker(DynamicEntity entity)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Property property in entity.Properties)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; KeyProperty key = property as KeyProperty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new Moniker(entity.Name, key.Value.Value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private sealed class CreateAdapter : AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DynamicEntity entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PreCreate(GetEntityMoniker(entity), entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DynamicEntity entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = GetEntityMoniker(entity);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (moniker == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; moniker = new Moniker(entity.Name, (Guid)context.OutputParameters[ParameterName.Id]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PostCreate(moniker, entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private sealed class UpdateAdapter : AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DynamicEntity entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PreUpdate(GetEntityMoniker(entity), entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DynamicEntity entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PostUpdate(GetEntityMoniker(entity), entity, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private sealed class DeleteAdapter : AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PreDelete(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.Target]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PostDelete(moniker, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private sealed class AssignAdapter : AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.Target];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SecurityPrincipal assignee = (SecurityPrincipal)context.InputParameters[ParameterName.Assignee]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PreAssign(moniker, assignee, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.Target];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SecurityPrincipal assignee = (SecurityPrincipal)context.InputParameters[ParameterName.Assignee]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PostAssign(moniker, assignee, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private sealed class SetStateAdapter : AdapterBase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePre(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.EntityMoniker];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string stateName = (string)context.InputParameters[ParameterName.State];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int status = (int)context.InputParameters[ParameterName.Status]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PreSetState(moniker, ref stateName, ref status, context); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.InputParameters[ParameterName.State] = stateName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.InputParameters[ParameterName.Status] = status;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ExecutePost(ExplicitPluginBase plugin, IPluginExecutionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Moniker moniker = (Moniker)context.InputParameters[ParameterName.EntityMoniker];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string stateName = (string)context.InputParameters[ParameterName.State];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int status = (int)context.InputParameters[ParameterName.Status]; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; plugin.PostSetState(moniker, stateName, status, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6544020" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/CRM/default.aspx">CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Plug-in/default.aspx">Plug-in</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Extensibility/default.aspx">Extensibility</category></item><item><title>CRM V3.0 Service Scheduling Performance and Scalability White Paper</title><link>http://blogs.msdn.com/akezyt/archive/2007/09/22/crm-v3-0-service-scheduling-performance-and-scalability-white-paper.aspx</link><pubDate>Sat, 22 Sep 2007 21:54:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5058820</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/5058820.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=5058820</wfw:commentRss><description>&lt;p&gt;Our Business System Architecture (BSA) published &lt;a href="https://mail.microsoft.com/redir.aspx?C=970dbfdc63b949048fabbb164bdb9a94&amp;amp;URL=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3ffamilyid%3d4E077F9F-A712-4CDC-BDEF-FB9969E46F2B%26displaylang%3den"&gt;Service Scheduling: Optimizations and Considerations&lt;/a&gt;&amp;nbsp;white paper. It presented prescriptive guidance about&amp;nbsp;what can customers/ISVs do to improve performance and scalability of Service Scheduling in CRM V3.0. It is based on their test and performance&amp;nbsp;tuning on large deployment. It can be downloaded at &lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=4E077F9F-A712-4CDC-BDEF-FB9969E46F2B&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=4E077F9F-A712-4CDC-BDEF-FB9969E46F2B&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=4E077F9F-A712-4CDC-BDEF-FB9969E46F2B&amp;amp;displaylang=en&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Service scheduling was my first team in CRM when I joined 3 years ago so I always have a special place for it. I should write more about it in the future.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5058820" width="1" height="1"&gt;</description></item><item><title>Microsoft released Windows Live ID SDK</title><link>http://blogs.msdn.com/akezyt/archive/2007/08/23/microsoft-released-windows-live-id-sdk.aspx</link><pubDate>Thu, 23 Aug 2007 08:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4520774</guid><dc:creator>Akezyt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4520774.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4520774</wfw:commentRss><description>&lt;p&gt;Last week Microsoft released Windows Live ID SDK. It is an update of the alpha it released sometimes ago. Last time I check the alpha, it still use IDCRL (unmanaged DLL). I will check this new update and post more details. Hopefully they release something that we can use from JScript.&lt;br&gt;&lt;/p&gt;&lt;p&gt;SDK can be downloaded at &lt;a href="http://dev.live.com/liveid/" title="http://dev.live.com/liveid/" mce_href="http://dev.live.com/liveid/"&gt;http://dev.live.com/liveid/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4520774" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Live/default.aspx">Live</category></item><item><title>CRM Queue Gadget passed 900 downloads</title><link>http://blogs.msdn.com/akezyt/archive/2007/08/20/crm-queue-gadget-hit-400-downloads.aspx</link><pubDate>Mon, 20 Aug 2007 23:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4484235</guid><dc:creator>Akezyt</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4484235.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4484235</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://blogs.msdn.com/akezyt/archive/2007/08/03/crm-queue-gadget.aspx" mce_href="http://blogs.msdn.com/akezyt/archive/2007/08/03/crm-queue-gadget.aspx"&gt;CRM queue gadget&lt;/A&gt; that I posted on &lt;A href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=A6791FE6-5A4C-4432-8FBD-BBD8A499120B" mce_href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=A6791FE6-5A4C-4432-8FBD-BBD8A499120B"&gt;gotdotnet&lt;/A&gt; 2 weeks ago now passes 900 downloads. Thank you everyone who downloaded and tried it out.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4484235" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Gadget/default.aspx">Gadget</category></item><item><title>College students from Thailand won Microsoft Imagine Cup 2007</title><link>http://blogs.msdn.com/akezyt/archive/2007/08/14/college-students-from-thailand-won-microsoft-imagine-cup-2007.aspx</link><pubDate>Wed, 15 Aug 2007 01:38:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4391196</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4391196.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4391196</wfw:commentRss><description>&lt;p&gt;A team of college students from Thailand won Microsoft Imagine Cup 2007. This is really cool and should give more visibility to Thailand in IT and computer science arena.&lt;/p&gt; &lt;p&gt;By the way, one member of this team comes from my school (Chulalongkorn University).&lt;/p&gt; &lt;p&gt;From: &lt;a href="http://www.microsoft.com/presspass/press/2007/aug07/08-10ImagineCupWinnersPR.mspx"&gt;Microsoft Announces Imagine Cup 2007 Winners&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4391196" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/Thailand/default.aspx">Thailand</category></item><item><title>SOA in the Real World</title><link>http://blogs.msdn.com/akezyt/archive/2007/08/10/soa-in-the-real-world.aspx</link><pubDate>Fri, 10 Aug 2007 19:43:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4322991</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4322991.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4322991</wfw:commentRss><description>&lt;p&gt;While checking &lt;a href="http://blogs.msdn.com/jevdemon/default.aspx"&gt;Loosely Couple Thinking&lt;/a&gt;, I found that an interesting eBook about Service Oriented Architecture, SOA&amp;nbsp;in the Real World, now available. &lt;/p&gt; &lt;p&gt;You can download it from &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;displaylang=en&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4322991" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/SOA/default.aspx">SOA</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>CRM Queue Gadget</title><link>http://blogs.msdn.com/akezyt/archive/2007/08/03/crm-queue-gadget.aspx</link><pubDate>Fri, 03 Aug 2007 19:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4208951</guid><dc:creator>Akezyt</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4208951.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4208951</wfw:commentRss><description>&lt;H3&gt;Introduction&lt;/H3&gt;
&lt;P&gt;Microsoft CRM 3.0 shipped with an extensive web service API that can be used by various types of applications. Here is a sample Windows sidebar gadget (or just gadget) that retrieves queue items related to the currently logged in user every predefined interval. Since the gadget is always available on the desktop but small in size, the ideal information to display on gadget should be something dynamic and concise. In Microsoft CRM context, the queue item entity fits squarely as it is changed quite frequently and requires immediate attention from a user. 
&lt;P&gt;The code is provided at &lt;A href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=A6791FE6-5A4C-4432-8FBD-BBD8A499120B"&gt;http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=A6791FE6-5A4C-4432-8FBD-BBD8A499120B&lt;/A&gt; 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/InProgress.jpg" mce_href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/InProgress.jpg" atomicselection="true"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt=InProgress src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/InProgress_thumb.jpg" border=0 mce_src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/InProgress_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Figure 1 "In progress" queue items 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Assigned.jpg" mce_href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Assigned.jpg" atomicselection="true"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt=Assigned src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Assigned_thumb.jpg" border=0 mce_src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Assigned_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Figure 2 "Assigned" queue items 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Settings.jpg" mce_href="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Settings.jpg" atomicselection="true"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=216 alt=Settings src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Settings_thumb.jpg" width=240 border=0 mce_src="http://blogs.msdn.com/blogfiles/akezyt/WindowsLiveWriter/CRMQueueGadget_87A7/Settings_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Figure 3 Settings window 
&lt;H3&gt;Developing CRM Gadget&lt;/H3&gt;
&lt;P&gt;For more information about developing gadget in general, please refer to MSDN article in the resource section. This article will focus more on CRM specific aspects. 
&lt;H4&gt;Retrieving data from CRM&lt;/H4&gt;
&lt;P&gt;Gadgets are composed of HTML and Jscript. We can use XmlHttp from JScript to send hand crafted SOAP message to the CRM server. Then we use an Msxml2.DOMDocument to parse the response to get the result. We need not do it asynchronously as the user is not blocked by the gadget anyway and it will be much more complicated to do it asynchronously. 
&lt;P&gt;In keeping with best practices, this sample retrieves only columns that are needed to reduce server load. 
&lt;H4&gt;Reading and writing settings through the gadget infrastructure&lt;/H4&gt;
&lt;P&gt;The gadget infrastructure provides a nice API for reading and writing settings. Be careful about storing sensitive information though. In this case, we just store the CRM server name, polling interval, and queue type so we are okay. 
&lt;P&gt;For reading settings 
&lt;P&gt;var currentServerName = System.Gadget.Settings.readString("crmServerName"); 
&lt;P&gt;For writing settings 
&lt;P&gt;var temp = serverName.value; 
&lt;P&gt;System.Gadget.Settings.writeString("crmServerName", temp); 
&lt;H4&gt;Securing gadget&lt;/H4&gt;
&lt;P&gt;Gadgets also subject to all sorts of cross site scripting vulnerabilities, since they are also web applications. All user input should be validated before using it. All external data (including data from the CRM server) must be properly encoded before rendering. 
&lt;H4&gt;Using standard style sheet&lt;/H4&gt;
&lt;P&gt;This sample utilizes template.css to make the gadget look consistent with the CRM web application. For example the server name label is shown as a required field. This template.css file is shipped with CRM SDK. You can download it from &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=9C178B68-3A06-4898-BC83-BD14B74308C5&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=9C178B68-3A06-4898-BC83-BD14B74308C5&amp;amp;displaylang=en"&gt;Microsoft.com&lt;/A&gt;. 
&lt;H4&gt;Deploying gadget&lt;/H4&gt;
&lt;P&gt;Because this gadget is a real application though it looks cute; there will be a time that you will want to patch it after you ship. The best way to enable gadget patching is to deploy it with MSI. However, for simplicity of our sample, I just use the zip approach. All you need to do is zip all HTML, JScripts, CSS, and the manifest (gadget.xml) together and change the resulting file’s extension from .zip to .gadget. Then the user can install it by double clicking. 
&lt;H3&gt;Resources&lt;/H3&gt;
&lt;P&gt;- MSDN Windows Sidebar Gadget Development Overview (&lt;A href="http://msdn2.microsoft.com/en-us/library/aa965850.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa965850.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa965850.aspx&lt;/A&gt;) 
&lt;P&gt;- System.Gadget.Settings in MSDN (&lt;A href="http://msdn2.microsoft.com/en-us/library/ms723661.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms723661.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms723661.aspx&lt;/A&gt;) 
&lt;P&gt;- Other CRM Windows sidebar gadgets 
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.codeproject.com/gadgets/DynamicsCRMGadget.asp" mce_href="http://www.codeproject.com/gadgets/DynamicsCRMGadget.asp"&gt;http://www.codeproject.com/gadgets/DynamicsCRMGadget.asp&lt;/A&gt; 
&lt;DIV class=wlWriterSmartContent id=0767317B-992E-4b12-91E0-4F059A8CECA8:ad65eefc-2106-4a8e-a4dd-a4171b6dd611 contentEditable=false style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;A href="http://technorati.com/tags/Microsoft%20CRM" rel=tag mce_href="http://technorati.com/tags/Microsoft%20CRM"&gt;Microsoft CRM&lt;/A&gt;, &lt;A href="http://technorati.com/tags/Gadget" rel=tag mce_href="http://technorati.com/tags/Gadget"&gt;Gadget&lt;/A&gt;&lt;/DIV&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/joris_kalz/pages/Vista-Microsoft-CRM-Search-Gadget.aspx" mce_href="http://blogs.msdn.com/joris_kalz/pages/Vista-Microsoft-CRM-Search-Gadget.aspx"&gt;http://blogs.msdn.com/joris_kalz/pages/Vista-Microsoft-CRM-Search-Gadget.aspx&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;- CRM SDK (&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=9C178B68-3A06-4898-BC83-BD14B74308C5&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=9C178B68-3A06-4898-BC83-BD14B74308C5&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=9C178B68-3A06-4898-BC83-BD14B74308C5&amp;amp;displaylang=en&lt;/A&gt;).&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4208951" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/akezyt/archive/tags/Gadget/default.aspx">Gadget</category></item><item><title>Presenting at TechReady 5</title><link>http://blogs.msdn.com/akezyt/archive/2007/07/26/Presenting-at-TechReady-5.aspx</link><pubDate>Fri, 27 Jul 2007 01:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4124489</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4124489.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4124489</wfw:commentRss><description>&lt;p&gt;This is the first time I present/demo in front of audience this size, quite an experience for me. Last time I checked, one of the session I presented/demoed is one of the top 5 session in business solutions.&lt;br&gt;&lt;/p&gt;&lt;p&gt;For those who don't know, TechReady is Microsoft event about preparing partners and field sales for new products being launched.&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4124489" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/akezyt/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>Nice article about BizTalk Crm Adapter</title><link>http://blogs.msdn.com/akezyt/archive/2007/06/03/nice-article-about-biztalk-crm-adapter.aspx</link><pubDate>Sun, 03 Jun 2007 17:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4125503</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4125503.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4125503</wfw:commentRss><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;I found this nice &lt;a href="http://blogs.msdn.com/brajens/archive/2007/05/30/using-microsoft-biztalk-dynamics-crm-adapter-part-2.aspx" title="http://blogs.msdn.com/brajens/archive/2007/05/30/using-microsoft-biztalk-dynamics-crm-adapter-part-2.aspx" mce_href="http://blogs.msdn.com/brajens/archive/2007/05/30/using-microsoft-biztalk-dynamics-crm-adapter-part-2.aspx"&gt;blog posts&lt;/a&gt; about BizTalk Crm Adapter. Check it out.&lt;br&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4125503" width="1" height="1"&gt;</description></item><item><title>Another View of CRM Data</title><link>http://blogs.msdn.com/akezyt/archive/2007/02/24/another-view-of-crm-data.aspx</link><pubDate>Sat, 24 Feb 2007 06:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4124319</guid><dc:creator>Akezyt</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/akezyt/comments/4124319.aspx</comments><wfw:commentRss>http://blogs.msdn.com/akezyt/commentrss.aspx?PostID=4124319</wfw:commentRss><description>&lt;P&gt;Cross posted from CRM team blog. I wrote this article last week and it was published this week.&lt;BR&gt;
&lt;H2&gt;Another View of CRM Data&lt;/H2&gt;
&lt;P&gt;[Code examples are on the CRM Sandbox in the &lt;A href="http://www.gotdotnet.com/codegallery/releases/viewuploads.aspx?id=b6499eb0-0eae-4597-b38e-ee9cbc71a404" target=_blank mce_href="http://www.gotdotnet.com/codegallery/releases/viewuploads.aspx?id=b6499eb0-0eae-4597-b38e-ee9cbc71a404"&gt;downloads section&lt;/A&gt;.] &lt;A href="http://www.microsoft.com/dynamics/crm/" target=_blank mce_href="http://www.microsoft.com/dynamics/crm/"&gt;MS Dynamics CRM&lt;/A&gt; shipped with grid view and form view for displaying data such as account or contact information. However, that does not mean it is the only way to present CRM data. This article will show&amp;nbsp;a way&amp;nbsp;to represent CRM accounts&amp;nbsp;on a&amp;nbsp;map. &lt;/P&gt;
&lt;P&gt;&lt;IMG height=336 alt="account map.PNG" src="http://blogs.msdn.com/blogfiles/crm/WindowsLiveWriter/AnotherViewofCRMData_7E62/clip_image002.jpg" width=528 mce_src="http://blogs.msdn.com/blogfiles/crm/WindowsLiveWriter/AnotherViewofCRMData_7E62/clip_image002.jpg"&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Populating account's coordinate.&lt;/STRONG&gt; Before we can show the account on the map, we first need to populate account's location into CRM. Most account/contact already contains shipping or billing address. However, they are not in the format that is easy to map or locate. Out of the box, account already contains 'latitude' and 'longitude' attributes that we can use but they are not automatically populated by CRM. So we need to convert the human readable street address into latitude and longitude coordinate. This process is called geocoding. For existing CRM deployment where accounts and contacts are created without latitude and longitude, we need to mass-populate them using web service information in the CRM SDK. The are several providers that offer geocoding service such as: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/mappoint/default.mspx" target=_blank mce_href="http://www.microsoft.com/mappoint/default.mspx"&gt;MapPoint&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://developer.yahoo.com/maps/rest/V1/geocode.html" target=_blank mce_href="http://developer.yahoo.com/maps/rest/V1/geocode.html"&gt;Yahoo Map&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;In this example, we use the&amp;nbsp;&lt;A href="https://mappoint-css.partners.extranet.microsoft.com/MwsSignup/Eval2.aspx" mce_href="https://mappoint-css.partners.extranet.microsoft.com/MwsSignup/Eval2.aspx"&gt;MapPoint&lt;/A&gt; web service. It is free of charge but you need to register for developer account before you can use it. There are some restrictions on developer account so double check before using it on commercial system. For new account that will be created after this initial mass-populating, we could incrementally populate latitude/longitude for them using JavaScript on form's &lt;EM&gt;OnSave &lt;/EM&gt;event or using server side callout. Sometimes, it might be easier to geocode each account's address on the fly and plot them on the map every time. However, doing so would cause serious performance and unnecessary load time. Moreover, after getting location data into CRM, we can do something interesting such as optimizing delivery/service truck route based on sales order's account/contact address. &lt;STRONG&gt;Displaying Account on the Map&lt;/STRONG&gt; In this sample, we will just show each account on map using Virtual Earth map control (&lt;A href="http://dev.live.com/virtualearth/sdk" mce_href="http://dev.live.com/virtualearth/sdk"&gt;http://dev.live.com/virtualearth/sdk&lt;/A&gt;). It is quite easy to use after we get account’s latitude and longitude. Another interesting part is how do we query actual accounts from saved query. The steps are like this:&lt;BR&gt;
&lt;BLOCKQUOTE&gt;- Retrieve the actual fetch XML on &lt;EM&gt;savedquery&lt;/EM&gt; entity. - Convert that fetch&amp;nbsp;XML into &lt;EM&gt;QueryExpression&lt;/EM&gt; object using &lt;EM&gt;FetchXmlToQueryExpressionRequest&lt;/EM&gt;. - Use the &lt;EM&gt;QueryExpression&lt;/EM&gt; to retrieve list of accounts. 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;For better performance, we can also cache the &lt;EM&gt;QueryExpression&lt;/EM&gt; so we don't have to look it up every time and save 2 web service calls but we are not doing it for simplicity. JavaScript then use &lt;EM&gt;XmlHttpRequest&lt;/EM&gt; to send request XML to our &lt;EM&gt;QueryService&lt;/EM&gt; and gets back XML. I manually created request XML and parsed response XML. However, you can use ASP.Net AJAX to create JavaScript proxy and save some more time. Showing account in map view is just one of another way to use CRM data. We hope to publish some more examples in the near future. But for now, we trust this example&amp;nbsp;will&amp;nbsp;provide some interesting concepts and ideas to consider for your implementation of CRM. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4124319" width="1" height="1"&gt;</description></item></channel></rss>