AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2009, 11:21   #1  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Регистрация PlugIn
Привет, Всем.. Вот пытаюсь написать первый в жизни PlugIn. Пока не очень получается.. Задача состоит в том, что необходимо реализовать следующее: при добавлении продуктов в возможной сделке ,в форме продукт для возможной сделки при нажатии сохранить нужно брать значение суммы из моего поля "Моя сумма" и присваивать это значение в прайс-листе для соответствующего продукта.. Т.е. выставлять цену за данный продукт в прайс-лист из формы "Продукт для возможной сделки" ..
Не могу понять, как из текста PlugIn считать значение "Моя сумма" и еще сложнее как эту сумму подставить в прайс-лист.. Не знаю как зарегистрировать этот PlugIn "on Create message".. .. и что еще нужно регистрировать..
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Win32;
namespace TestPlugin
{
publicclassExecuteHandler : IPlugin
{
public ExecuteHandler(string config, string secureConfig)
{
}
#region IPlugin Members
publicvoid Execute(IPluginExecutionContext context)
{
}
#endregion
}
}
Старый 06.05.2009, 11:46   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Здравствуйте, уже здесь.

Итак. Для начала Вам надо создать плагин. Что для этого надо делать описано тут. Там же есть ссылка на ресурс, откуда нможно скачать утилиту регистрации плагинов.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 06.05.2009, 12:33   #3  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Привет еще раз. Можно еще вопрос?.. Создаю плагин по вашей ссылки.
При создании нового проекта на C# , выбираю шаблон, однако появляется ошибка:
"С:\Users\Таня\AppData\Local\Temp\elkeikyu.vsc\Temp\MSCRM Plug-in1.csproj(63,11): The imported project "C:\Microsoft.CSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct? and that the file exists on disk"
Старый 06.05.2009, 12:37   #4  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Elka Посмотреть сообщение
Привет еще раз. Можно еще вопрос?.. Создаю плагин по вашей ссылки.
При создании нового проекта на C# , выбираю шаблон, однако появляется ошибка:
"С:\Users\Таня\AppData\Local\Temp\elkeikyu.vsc\Temp\MSCRM Plug-in1.csproj(63,11): The imported project "C:\Microsoft.CSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct? and that the file exists on disk"
Посмотрите эту ссылку - там описано, как это править.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: Elka (0).
Старый 06.05.2009, 16:16   #5  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Спасибо. Начать получилось
Старый 06.05.2009, 16:20   #6  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Elka Посмотреть сообщение
Спасибо. Начать получилось
Лучче б единичкой поблагодарили =)
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 06.05.2009, 16:43   #7  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Цитата:
Сообщение от a33ik Посмотреть сообщение
Лучче б единичкой поблагодарили =)
Сорри, не поняла, что это за цифры...
Старый 06.05.2009, 20:50   #8  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Можно еще попарить... А как обратиться в plugin к конкретному прайс-листу с названием "Основной" и найти в нем позицию с нужным продуктом...
Старый 06.05.2009, 21:21   #9  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb
Цитата:
Сообщение от Elka Посмотреть сообщение
Можно еще попарить... А как обратиться в plugin к конкретному прайс-листу с названием "Основной" и найти в нем позицию с нужным продуктом...
Для этого необходимо выполнить зачитку этого прайса. Если собираетесь искать по имени, то выполняйте поиск при помощи сообщения RetrieveMultiple и QueryByAttribute. Примеры использования приведены там же. Обращайтесь, если что.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 07.05.2009, 17:31   #10  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Спасибо большое за ссылки... У меня есть еще 2 вопроса ():
1)не знаю как получить значение из моего поля new_esum
2)Если я правильно понимаю , то BusinessEntityCollection retrieved = service.RetrieveMultiple(query);
в retrieved я получаю все позиции прайс-листа с нужным мне значением продукта.. как можно перебрать эти позиции() и присвоить им новое значение amount





publicvoid Execute(IPluginExecutionContext context)
{
DynamicEntity entity = null;
if (context.InputParameters.Properties.Contains(ParameterName.Target) &&
context.InputParameters.Properties[
ParameterName.Target] isDynamicEntity)
{
// Obtain the target business entity from the input parmameters.
entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
//______________________________
if (context.MessageName != MessageName.Update.ToString()
&& context.MessageName !=
MessageName.Create.ToString())
{
thrownewInvalidPluginExecutionException("Smth wrong with Update stage may be");
}
//___________________________
}
else
{
return;
}
try
{

ICrmService crmService = context.CreateCrmService(true);
//_________________________________________________________
//пытаюсь получить значение из моего поля new_esum (тип money)---
//
float sum = (float)entity.Properties["new_esum"];
String new_productname = "";

//считываю значение продукта
if(entity.Properties.Contains("productid"))
{

ColumnSet cs = newColumnSet();
Lookup regarding = (Lookup)entity.Properties["productid"];
cs.Attributes.Add(
"name");
product _product = (product)crmService.Retrieve(EntityName.product.ToString(), regarding.Value, cs);
if (_product == null || _product.name == null)
{
return;
}
else
{
new_productname = _product.name.ToString();
}
}
//ищу нужную позицию в прайс-листе
CrmService service = newCrmService();
service.Credentials = System.Net.
CredentialCache.DefaultCredentials;
// Create the query object.
QueryByAttribute query = newQueryByAttribute();
query.ColumnSet =
newAllColumns();
query.EntityName =
EntityName.productpricelevel.ToString();
// The query will retrieve all productpricelevel whose productidname is new_productname.
query.Attributes = newstring[] { "productidname" };
query.Values =
newstring[] { new_productname };
// Execute the retrieval.
// если правильно понимаю, получила все позиции прайс-листа с продуктом
//равным new_productname
BusinessEntityCollection retrieved = service.RetrieveMultiple(query);
// не знаю как перебрать значения и присвоить значение sum
// ((((
retrieved.Properties.Add(newStringProperty("amount", sum));



}
Старый 07.05.2009, 17:40   #11  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb
Для того, чтобы перебрать, необходимо например использовать конструкцию foreach:

Код:
...
BusinessEntityCollection retrieved = service.RetrieveMultiple(query);

foreach (DynamicEntity product in retrieved.BusinessEntities)
{
	product["amount"] = new CrmDecimal(sum);
	service.Update(product);
}
Используйте такую конструкцию вместо float sum = (float)entity.Properties["new_esum"]; :

Код:
decimal sum = (decimal)entity.Properties["new_esum"].Value;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 07.05.2009, 17:57   #12  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Спасибо!!!

Только компилятор ругается на Value
decimal sum = (decimal)entity.Properties["new_esum"].Value;
Пишет: "object" не содержит определение "Value" и не был найден метод расширения "Value", принимающий тип "object" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)


using System;
using System.Collections.Generic;
using Microsoft.Win32;
using Microsoft.Crm.Sdk.Query;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using System.Text;
Старый 07.05.2009, 17:59   #13  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb
Цитата:
Сообщение от Elka Посмотреть сообщение
Спасибо!!!

Только компилятор ругается на Value
decimal sum = (decimal)entity.Properties["new_esum"].Value;
Пишет: "object" не содержит определение "Value" и не был найден метод расширения "Value", принимающий тип "object" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)


using System;
using System.Collections.Generic;
using Microsoft.Win32;
using Microsoft.Crm.Sdk.Query;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using System.Text;
Сори. Туплю. Надо так:
Код:
decimal sum = ((CrmMoney)entity.Properties["new_esum"]).Value;// если поле - типа Money
decimal sum = ((CrmDecimal)entity.Properties["new_esum"]).Value;// если поле - типа Decimal
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 07.05.2009, 18:30   #14  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Еще раз спасибо.. Если я вам еще не надоела, то у меня еще вопрос...
Я отладила (F6).
Пытаюсь зарегистрировать..
  1. Register -> Register New Assembly (Ctrl + A)
  2. Указываем AKPuginActivity.dll (C:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\AKPuginActivity\AKPuginActivity\bin\Debug) и оставляем выбор сохранения в базе данных.
На 2-м шаге ругается: "Unable to load the specified Plugin Assembly"
"Unhandled Exception: System.IO.InvalidDataException: Assembly name MSCRM EditPrice, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null cannot be parsed.
в PluginRegistrationTool.AssemblyReader.RetrieveAssemblyProperties(Assembly assembly, String path)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly)
в PluginRegistrationTool.PluginRegistrationForm.btnLoadAssembly_Click(Object sender, EventArgs e)"


Не подскажите, что не так...?
Старый 07.05.2009, 18:35   #15  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb
Цитата:
Сообщение от Elka Посмотреть сообщение
Еще раз спасибо.. Если я вам еще не надоела, то у меня еще вопрос...
Я отладила (F6).
Пытаюсь зарегистрировать..
  1. Register -> Register New Assembly (Ctrl + A)
  2. Указываем AKPuginActivity.dll (C:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\AKPuginActivity\AKPuginActivity\bin\Debug) и оставляем выбор сохранения в базе данных.
На 2-м шаге ругается: "Unable to load the specified Plugin Assembly"
"Unhandled Exception: System.IO.InvalidDataException: Assembly name MSCRM EditPrice, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null cannot be parsed.
в PluginRegistrationTool.AssemblyReader.RetrieveAssemblyProperties(Assembly assembly, String path)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly)
в PluginRegistrationTool.PluginRegistrationForm.btnLoadAssembly_Click(Object sender, EventArgs e)"


Не подскажите, что не так...?
Перед регистрацией Вам необходимо застронгнеймить сборку.
Для этого откройте свойства проекта, откройте Signing, укажите галочку Sign the assembly, в драпдауне выберите New, создайте новый, сохраните, сбилдьте, повторите регистрацию.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 07.05.2009, 19:05   #16  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
не помогло...

у меня Microsoft Visual C# 2008 Express Edition.
В свойствах проекта я выбрала "Подписывание"-> "Подписать сборку"-> "Создать"...
Ввела Имя файла ключей mypluginlib
Не ставила галу на "Защитить мой файл ключей паролем"
Создался файл mypluginlib.snk

Потом сохранила, нажала F6 И попробовала снова зарегистрироваться, та же ошибка...
Старый 07.05.2009, 19:17   #17  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb
Цитата:
Сообщение от Elka Посмотреть сообщение
не помогло...

у меня Microsoft Visual C# 2008 Express Edition.
В свойствах проекта я выбрала "Подписывание"-> "Подписать сборку"-> "Создать"...
Ввела Имя файла ключей mypluginlib
Не ставила галу на "Защитить мой файл ключей паролем"
Создался файл mypluginlib.snk

Потом сохранила, нажала F6 И попробовала снова зарегистрироваться, та же ошибка...
Кажется понял. Вы пользуетесь консольным тулом от майкрософта? Фу, какая гадость (при том, что я таки сторонник их технологий). Возьмите тул из вложения и пользуйтесь им наздоровье.
Вложения
Тип файла: rar PluginRegistration.exe.rar (261.5 Кб, 171 просмотров)
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 08.05.2009, 11:25   #18  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Добрый день. (Спасибо за ваше терпение..получается целое пособие "для чайников" )
Воспользовалась вашим тулом.. Ругаться стал как-то иначе..
Меня смущают 2 момента:
1)При попытке отладить plugin (F5) выдается ошибка "Проект, создающий библиотеку классов, не может быть непосредственно запущен. Для отладки данного проекта добавьте к решению проект создающий приложение и ссылающийся на эту библиотеку и сделайте его запускаемым"
Это нормально? Так и должно быть? Или косяк?
2)Для всех вариантов CRM можно регистрировать plugin? У нас установлена Microsoft Dynamics CRM 4.0 Workgroup Edition .

Ошибка, которую выдает Plugin Registration tools :
Unhandled Exception: System.Runtime.Serialization.SerializationException: Тип "PluginRegistrationTool.CrmOrganization" в сборке "PluginRegistration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый.
Server stack trace:
в System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
в System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
в System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
в System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
в System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
в System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage..ctor(IMethodReturnMessage mrm)
в System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.SmuggleIfPossible(IMessage msg)
в System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
в System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)

Exception rethrown at [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly)
в PluginRegistrationTool.PluginRegistrationForm.btnLoadAssembly_Click(Object sender, EventArgs e)

Старый 08.05.2009, 11:44   #19  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Elka Посмотреть сообщение
Добрый день. (Спасибо за ваше терпение..получается целое пособие "для чайников" )
Воспользовалась вашим тулом.. Ругаться стал как-то иначе..
Меня смущают 2 момента:
1)При попытке отладить plugin (F5) выдается ошибка "Проект, создающий библиотеку классов, не может быть непосредственно запущен. Для отладки данного проекта добавьте к решению проект создающий приложение и ссылающийся на эту библиотеку и сделайте его запускаемым"
Это нормально? Так и должно быть? Или косяк?
2)Для всех вариантов CRM можно регистрировать plugin? У нас установлена Microsoft Dynamics CRM 4.0 Workgroup Edition .

Ошибка, которую выдает Plugin Registration tools :
Unhandled Exception: System.Runtime.Serialization.SerializationException: Тип "PluginRegistrationTool.CrmOrganization" в сборке "PluginRegistration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый.
Server stack trace:
в System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
в System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
в System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
в System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
в System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
в System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
в System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage..ctor(IMethodReturnMessage mrm)
в System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.SmuggleIfPossible(IMessage msg)
в System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
в System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)

Exception rethrown at [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
в PluginRegistrationTool.AssemblyReader.RetrievePluginsFromAssembly(String path)
в PluginRegistrationTool.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly)
в PluginRegistrationTool.PluginRegistrationForm.btnLoadAssembly_Click(Object sender, EventArgs e)
1. Отладка. Для отладки воспользуйтесь следующим подходом - скопируйте файлы dll и pdb в папку <каталог в который установлен MS CRM Server>\Server\bin\assembly\, при регистрации плагина - указывайте жёсткий диск, а не база, для отладки - необходимо атачиться к w3p процессу.
2. Плагин. Судя по всему не застронгнеймен. Потому что в стеке написано PublicKeyToken=null.
3. Віложите сюда, пожалуйста код плагина, будет понятнее где собака порылась.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 08.05.2009, 11:59   #20  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
"для отладки - необходимо атачиться к w3p процессу." А это как? (стыдно, но правда не знаю.. )


Код плагина:

using System;
using System.Collections.Generic;
using Microsoft.Win32;
using Microsoft.Crm.Sdk.Query;
// Microsoft Dynamics CRM namespaces
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using System.Text;
namespace Crm.Plugins
{
publicclassMyPlugin : IPlugin
{
// Configuration information that can be passed to a plug-in at run-time.
privatestring _secureInformation;
privatestring _unsecureInformation;
// Note: Due to caching, Microsoft Dynamics CRM does not invoke the plug-in
// contructor every time the plug-in is executed.
// Related SDK topic: Writing the Plug-in Constructor
public MyPlugin(string unsecureInfo, string secureInfo)
{
_secureInformation = secureInfo;
_unsecureInformation = unsecureInfo;
}
// Related SDK topic: Writing a Plug-in
publicvoid Execute(IPluginExecutionContext context)
{
DynamicEntity entity = null;
// Check if the InputParameters property bag contains a target
// of the current operation and that target is of type DynamicEntity.
if (context.InputParameters.Properties.Contains(ParameterName.Target) &&
context.InputParameters.Properties[ParameterName.Target] isDynamicEntity)
{
// Obtain the target business entity from the input parmameters.
entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
// TODO Test for an entity type and message supported by your plug-in.
// if (entity.Name != EntityName.account.ToString()) { return; }
// if (context.MessageName != MessageName.Create.ToString()) { return; }
}
else
{
return;
}
try
{
// Create a Microsoft Dynamics CRM Web service proxy.
// TODO Uncomment or comment out the appropriate statement.
// For a plug-in running in the child pipeline, use this statement.
// CrmService crmService = CreateCrmService(context, true);
// For a plug-in running in the parent pipeline, use this statement.
ICrmService crmService = context.CreateCrmService(true);
//Їлв обм Ї®«гзЁвм §­ 祭ЁҐ Ё§ ¬®ҐЈ® Ї®«п new_esum ( вЁЇ money)---
//
decimal sum = ((CrmMoney)entity.Properties["new_esum"]).Value;
String new_productname = "";

//бзЁвлў о §­ 祭ЁҐ Їа®¤гЄв
if (entity.Properties.Contains("productid"))
{
ColumnSet cs = newColumnSet();
Lookup regarding = (Lookup)entity.Properties["productid"];
cs.Attributes.Add("name");
product _product = (product)crmService.Retrieve(EntityName.product.ToString(), regarding.Value, cs);
if (_product == null || _product.name == null)
{
return;
}
else
{
new_productname = _product.name.ToString();
}
}
//Їлв обм ­ ©вЁ ­г¦­го Ї®§ЁжЁо Їа ©б «Ёбв
CrmService service = newCrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Create the query object.
QueryByAttribute query = newQueryByAttribute();
query.ColumnSet = newAllColumns();
query.EntityName = EntityName.productpricelevel.ToString();
// The query will retrieve all productpricelevel whose productidname is new_productname.
query.Attributes = newstring[] { "productidname" };
query.Values = newstring[] { new_productname };
// Execute the retrieval.
// п в Є Ї®­Ё¬ о Ї®«гзЁ« ўбҐ Ї®§ЁжЁЁ Їа ©б «Ёбв б Їа®¤гЄв ¬Ё new_productname
BusinessEntityCollection retrieved = service.RetrieveMultiple(query);
// е®зг ®Ў­®ўЁвм §­ 祭ЁҐ ў Їа ©-«ЁбвҐ--- §¤Ґбм в®з­® ­Ґ в Є..­Ґ §­ о Є Є ЇҐаҐЎа вм §­ 祭Ёп...
// ((((


foreach (DynamicEntity product in retrieved.BusinessEntities)
{
product["amount"] = newCrmDecimal(sum);
service.Update(product);
}







// TODO Plug-in business logic goes here.
}
catch (System.Web.Services.Protocols.SoapException ex)
{
thrownewInvalidPluginExecutionException(
String.Format("An error occurred in the {0} plug-in.",
this.GetType().ToString()),
ex);
}
}
#region Private methods
///<summary>
/// Creates a CrmService proxy for plug-ins that execute in the child pipeline.
///</summary>
///<param name="context">The execution context that was passed to the plug-ins Execute method.</param>
///<param name="flag">Set to True to use impersontation.</param>
///<returns>A CrmServce instance.</returns>
privateCrmService CreateCrmService(IPluginExecutionContext context, Boolean flag)
{
CrmAuthenticationToken authToken = newCrmAuthenticationToken();
authToken.AuthenticationType = 0;
authToken.OrganizationName = context.OrganizationName;
// Include support for impersonation.
if (flag)
authToken.CallerId = context.UserId;
else
authToken.CallerId = context.InitiatingUserId;
CrmService service = newCrmService();
service.CrmAuthenticationTokenValue = authToken;
service.UseDefaultCredentials = true;
// Include support for infinite loop detection.
CorrelationToken corToken = newCorrelationToken();
corToken.CorrelationId = context.CorrelationId;
corToken.CorrelationUpdatedTime = context.CorrelationUpdatedTime;
corToken.Depth = context.Depth;
RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx");
service.CorrelationTokenValue = corToken;
return service;
}
///<summary>
/// Creates a MetadataService proxy for plug-ins that execute in the child pipeline.
///</summary>
///<param name="context">The execution context that was passed to the plug-ins Execute method.</param>
///<param name="flag">Set to True to use impersontation.</param>
///<returns>A MetadataServce instance.</returns>
privateMetadataService CreateMetadataService(IPluginExecutionContext context, Boolean flag)
{
CrmAuthenticationToken authToken = newCrmAuthenticationToken();
authToken.AuthenticationType = 0;
authToken.OrganizationName = context.OrganizationName;
// Include support for impersonation.
if (flag)
authToken.CallerId = context.UserId;
else
authToken.CallerId = context.InitiatingUserId;
MetadataService service = newMetadataService();
service.CrmAuthenticationTokenValue = authToken;
service.UseDefaultCredentials = true;
RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/metadataservice.asmx");
return service;
}
#endregion Private Methods
}
}

Последний раз редактировалось Elka; 08.05.2009 в 12:09.
Теги
c#, plugin, pluginregistrationtool, регистрация

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
CRM DE LA CREME! Three Top Tips for CRM 4.0 Plugin Development Blog bot Dynamics CRM: Blogs 0 13.08.2009 15:05
haditeo: Is it possible to register different event handlers in only one assembly to be registered in Dynamics CRM Plugin ? Blog bot Dynamics CRM: Blogs 0 13.08.2009 15:05
a33ik: Plugin for copying notes and attachements from lead to contact whis is converted from lead for Microsoft Dynamics CRM 4.0 Blog bot Dynamics CRM: Blogs 0 10.07.2009 17:05
Ronald Lemmen: Plugin registration tools for Visual Studio 2005 Blog bot Dynamics CRM: Blogs 0 17.04.2009 01:05
PlugIn ImageEntity Konstantin Katsovich Dynamics CRM: Разработка 3 16.01.2009 17:35

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:32.