Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly ‘Microsoft.Crm.Sdk….’

I created a simple plugin and when I was trying to register the plugin through the plugin registration tool I was getting the follwing error

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly ‘Microsoft.Crm.Sdk, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The system cannot find the file specified.

at System.Reflection.Assembly._GetExportedTypes()

at System.Reflection.Assembly.GetExportedTypes()

at PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path) in C:\Documents and Settings\arvinds1\Desktop\PluginRegistration\AssemblyReader.cs:line 59

at PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)

at PluginRegistrationTool.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly) in C:\Documents and Settings\arvinds1\Desktop\PluginRegistration\RegistrationHelper.cs:line 49

at PluginRegistrationTool.PluginRegistrationForm.btnLoadAssembly_Click(Object sender, EventArgs e) in C:\Documents and Settings\arvinds1\Desktop\PluginRegistration\PluginRegistrationForm.cs:line 127


The way I resolved the issue was by adding the microsoft.crm.sdk.dll to my machine’s GAC !!

I hope it works for others as well !!!

Many to many relationship in CRM 4.0 and Fetch XML

We have a custom entity called line of business (lob) for different line of business’s in our organization.

In CRM 3.0 there was no way we could have associated the lob custom entity with the system entity Team as there was no way of creating relationship between them.

But in CRM 4.0 we can now create a many to many relationship between the two.

Creating a many to many relationship between the two creates a new entity


Now say we want to write a custom code to retrieve all the teams associated with a given line of business, we can write something like below ( If we use query expression and retrieve multiple request it gives the error message saying that RetrieveMultiple is not supported on this entity)

This is the custom code for that

// setting the authentication token

CrmAuthenticationToken token = new CrmAuthenticationToken();

// 0- refers active directory

token.AuthenticationType = 0;

token.OrganizationName = “organizationname”;


CrmService crmService = new CrmService();

crmService.Url = http://servername/mscrmservices/2007/CrmService.asmx”;

crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;

crmService.CrmAuthenticationTokenValue = token;


string fetch2= @”<fetch mapping=’logical’>

<entity name=’new_team_new_lineofbusiness’>

<attribute name=’teamid’ />


<condition attribute=’new_lineofbusinessid’ operator=’eq’ value=’C4BE129E-9B3C-DB11-8CBA-001185E68627′ />





// Fetch the results.



String result2 = crmService.Fetch(fetch2);


XmlDocument doc = new XmlDocument();


XmlNodeList xnodlist = doc.GetElementsByTagName(“teamid”);

string teamID = “”;

if (xnodlist.Count != 0)


for (int i = 0; i < xnodlist.Count; i++)


XmlNode xnodRoot = xnodlist.Item(i);

teamID = xnodRoot.InnerText;




catch (SoapException ex)





Only the owner of an object can revoke the owner’s access to that object


We had written a callout for auto sharing and unsharing of opportunity’s record for postassign event.

On creation of the record we were auto sharing the record with the owner’s manager.

On change of the owner we are first unsharing the record with the owner’s manager and sharing it with new owner’s manager.

While doing this the error we are receiving  is  this

“Only the owner of an object can revoke the owner’s access to that object “

This error is  coming in this particular scenario

say we have a record shared with a particular user say A

now when we are trying to set the new owner as A what the code is trying to do is that,

it is trying to unshare the record with A  this is the point where we receiving this  error!!!

For e.g.

Lead record is owned by User A and is Shared with User A.

Now the Revoke code is running in context of User B and tries to run Revoke for User A who is the owner. We will get this error message.


Microsoft Dynamics CRM 3.0 and Microsoft Dynamics CRM 4.0 differences

Multiple organizations can now be hosted and WSDL APIs are now unique per organization.


The metadata API service has been extended to retrieve language information.


Plug-ins (callouts) and workflow now use the same event framework, allowing for even more extensibility.


The SDK has been expanded to include offline access.


Now we can programmatically create, read, update and delete the metadata such as entities, attributes and relationship.


There are three services instead of two which we used to have in previous version


CrmService – http://<crmserver>/mscrmservices/2007/crmservice.asmx

MetadataService – http://<crmserver>/mscrmservices/2007/metadataservice.asmx

DiscoveryService – http://<crmserver>/mscrmservices/2007/ad/crmdiscoveryservice.asmx


Previously to write callout we had to reference the follwing assembly




Instead now we have to reference these assemblies


  • Micorsoft.Crm.Sdk.dll
  • Micorsoft.Crm.SdkTypeProxy.dll
  • Micorsoft.Crm.Outlook.Sdk.dll



Now we can to settings and can then select customizations there we have the option of

Download Web Service Description File.


There we can find wsdl files for both CrmService and MetadataService which we can download to our machine and can the simply add web reference to them.



Previously to access and use the CrmService following lines of code were enough


CrmService service=new CrmService();

service.Url=// url for the CrmService



But now because of the multiple organization support we need to write the following lines of code to identify the organization for which we are writing our custom solution.


CrmAuthenticationToken token = new CrmAuthenticationToken();

token.AuthenticationType = 0;

            // 0- Active Directory

            // 1- Microsoft Dynamics CRM Live

            // 2- Internet-Facing deployment (IFD)

token.OrganizationName=“”;// name of the organization


CrmService service=new CrmService();

service .Url=// url for the CrmService            service.Credentials=System.Net.CredentialCache.DefaultCredentials;

service.CrmAuthenticationTokenValue = token;



We have to access the Metadataservice in the similar manner i.e. creating CrmAuthenticationToken and assigning it to CrmMetadataService’s CrmAuthenticationTokenValue.


In 3.0 version we could use Metadataservice to access metadata information about any specific entity however in the new version following things are possible


  • Creating a customentity.
  • Add or update an attribute for an entity.
  • Create or delete a relationship between two entities.
  • Add or remove an option from a picklist attribute and few others.



  // CrmDiscoveryService Web service can provide a list of organizations and their corresponding Web service

 // endpoints URL’s. We will use it to configure the CrmService and MetadataService Web service proxies.


  CrmDiscoveryService discService = new CrmDiscoveryService();

  discService.UseDefaultCredentials = true;

  discService.Url = http://localhost/MSCRMServices/2007/AD/CrmDiscoveryService.asmx&#8221;;


  // Retrieve the list of organization

RetrieveOrganizationsRequest orgRequest = new    RetrieveOrganizationsRequest();

RetrieveOrganizationsResponse orgResponse =(RetrieveOrganizationsResponse) discService.Execute(orgRequest);


// Loop through the list to locate the target organization


OrganizationDetail orgInfo = null;

foreach (OrganizationDetail orgDetail in orgResponse.OrganizationDetails)


if (orgDetail.OrganizationName == “OurOrganizationName”)


          orgInfo = orgDetail;





After obtaining the organization details, we can then access the CrmService and MetadataService Web Services to perform our business logic.



References :

Working with Microsoft Dynamics CRM 4.0 (Microsoft Press)

Good site for understanding System.Net.Mail Namespace


Plzz do check out this site if you need to write code for sending mail in asp.net 2.0



Creating a simple Callout in Microsoft Dynamics CRM 3.0

Create a class library project in Visual Studio 2003.


Add reference to the following assembly Microsoft.Crm.Platform.Callout.Base.dll.


Inherit the Microsoft.Crm.Callout.CrmCalloutBase class.


Now override the event against which you want to put your business logic.



Add web reference to CrmService



Set up the CrmService properties like url, credentials and CallerIdValue


CrmService service = new CrmService();

            service.Url = “http://servername: port /mscrmservices/2006/CrmServiceWsdl.aspx”;

            service.Credentials = System.Net.CredentialCache.DefaultCredentials;

            service.CallerIdValue = new CallerId();           

            service.CallerIdValue.CallerGuid = userContext.UserId;


For our PostUpdate event handler we can see that the values for preImageEntityXml as well as postImageEntityXml are passed as a string which essentialy is a xml.


public override void PostUpdate(

                                                CalloutUserContext  userContext,

                                                CalloutEntityContext  entityContext,

                                                string  preImageEntityXml,

                                                string  postImageEntityXml



So first we will convert it into a dynamic entity


DynamicEntity entityPost=ConvertToDynamicEntity(postImageEntityXml);


The definition of the ConvertToDynamicEntity function is


private static DynamicEntity ConvertToDynamicEntity(string xml)



                                                TextReader sr = new StringReader(xml);


                                                XmlRootAttribute root = new XmlRootAttribute(“BusinessEntity”);

                                                root.Namespace = http://schemas.microsoft.com/crm/2006/WebServices&#8221;;



                                                XmlSerializer xmlSerializer = new XmlSerializer(typeof(BusinessEntity), root);

                                                BusinessEntity entity = (BusinessEntity)xmlSerializer.Deserialize(sr);


                                                return (DynamicEntity) entity;



We’ll deserialize the xml output to get an instance of DynamicEntity.


To make it more easy to work with the properties we can make use of the following class PropertiyDictionary in our callout.





We’ll pass the instance of the newly created dynamic entity to the PropertyDictionary’s constructor.


PropertyDictionary properties=new PropertyDictionary(entityPost);


Now to work with properties we can do something like this


// For CrmDateTimeProperty

            if (properties.Contains(“actualclosedate”))


                CrmDateTimeProperty acd = (CrmDateTimeProperty)properties[“actualclosedate”];

                actualclosedate = acd.Value;



            // For CrmMoneyProperty

            if (properties.Contains(“new_estimatedrevenue”))



                CrmMoneyProperty ner = (CrmMoneyProperty)properties[“new_estimatedrevenue”];

                new_estimatedrevenue = ner.Value;


            // For PicklistProperty

            if (properties.Contains(“salesstagecode”))




                PicklistProperty salesstagecode = (PicklistProperty)properties[“salesstagecode”];               

                salesstage = salesstagecode.Value.Value.ToString();




That’s it…

Unable to generate a temporary class (result=1). error CS2001: Source file ‘C:\WINDOWS\TEMP\filename.cs’ could not be found error CS2008: No inputs specified


I was getting this error when I was trying to call a .NET dll from an ASP page.

The dll was making use of a web service.

And while searching for it I found that if we are making use of a web service from

an asp page, the page tries to create a temporary file in windows\temp directory and because it hasn’t got rights for the same we get the error.


We can resolve it by giving it the appropriate rights for the windows/temp folder


1) Right click the temp folder à Select properties

2) Go to security tab

3) Click on Add and add ASPNET account. ( In locations select your machine )

4) Then add one more account IWAM_D-0824 (i.e. IWAM_YourMachineName)

5) Try running the ASP page again. The page should run without any error.


Using .NET Assembly (DLL) in ASP page

1. Create a Assembly file using following:
        File >> New >> Project >> Class Library >> Name = MyLibCSharp
2. Add a function HelloWorld. Code will look as follows:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace MyLibCsharp




public class Class1


public String HelloWorld(String name)


return (“Hellow World; Welcome “ + name);




3. Sign the Assembly (To enable it to be used by multiple Applications):

Go to Project >> MyLibCSharp Properties >> Signing >> Sign the Assembly >> New >> Key.snk

4. Enable for COM Interop:

Go to Project >> MyLibCSharp Properties >> Build >> Output >> Check the “Register for COM interop.

5. Build the Assembly.

6. Add to GAC using “Visual Studio Command Prompt” the assembly is located in DEBUG/RELEASE folder.

gacutil -I MyLibCSharp.dll

7. Execute the following:

Regasm /tlb /codebase MyLibCSharp.dll

8. ASP code:


Dim foo

set foo = Server.CreateObject(“MyLibCSharp.Class1”)

Response.Write (foo.HelloWorld(“test”))


9. To unregister the assembly

Regasm /unregister MyLibCSharp.dll

10. And to remove the same from GAC (Global assembly cache)

Go to


find the assembly you want to remove

select it , right click it and select uninstall



Unable to start debugging. The Machine Debug Manager is disabled

Occasionally I used to receive this error

“Unable to start debugging. The Machine Debug Manager is disabled” when I try to run the solution from visual studio in debug mode.

The reason for this was Machine Debug Manager was in disabled state or not started.

So the solution for this is


1) Go to control panel.

2) Then Administrative Tools

3) Then services.

4) In services find the service named Machine debug manager.


Enable the service and start it if disabled or stopped.



Reflector -Nice tool for .NET developer

Reflector is a nice tool developed by Lutz Roeder.

It is somewhat similar to .Net ILDASM (Intermediate Language Dissembler).

The best thing about it is that we can even view the source code that also in different languages

C#, VB.NET, Delphi even the IL code itself.


This is the link



There are other good tools as well.


Do check it.