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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.05.2009, 11:44   #1  
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   #2  
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.
Старый 08.05.2009, 12:17   #3  
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
Подчистил код плагина. Попробуйте это:

Код:
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
{
    public class MyPlugin : IPlugin
    {
        private string _secureInformation;
        private string _unsecureInformation;
        public MyPlugin(string unsecureInfo, string secureInfo)
        {
            _secureInformation = secureInfo;
            _unsecureInformation = unsecureInfo;
        }
        public void Execute(IPluginExecutionContext context)
        {
            DynamicEntity entity = null;
            if (context.InputParameters.Properties.Contains(ParameterName.Target) && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity)
            {
                entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
            }
            else
            {
                return;
            }

            try
            {
                ICrmService crmService = context.CreateCrmService(true);

                decimal sum = ((CrmMoney)entity.Properties["new_esum"]).Value;
                String new_productname = "";

                if (entity.Properties.Contains("productid"))
                {
                    ColumnSet cs = new ColumnSet();
                    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;
                    }
                }

                QueryByAttribute query = new QueryByAttribute();
                query.ColumnSet = new AllColumns();
                query.EntityName = EntityName.productpricelevel.ToString();
                query.Attributes = new string[] { "productidname" };
                query.Values = new string[] { new_productname };

                BusinessEntityCollection retrieved = crmService.RetrieveMultiple(query);

                foreach (DynamicEntity product in retrieved.BusinessEntities)
                {
                    product["amount"] = new CrmDecimal(sum);
                    crmService.Update(product);
                }
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                throw new InvalidPluginExecutionException(String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex);
            }
        }
    }
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 08.05.2009, 12:27   #4  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Спасибо!!
Пока не изменилось ничего..
"для отладки - необходимо атачиться к w3p процессу." А это как? (стыдно, но правда не знаю.. )
Старый 08.05.2009, 12:38   #5  
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 Посмотреть сообщение
Спасибо!!
Пока не изменилось ничего..
"для отладки - необходимо атачиться к w3p процессу." А это как? (стыдно, но правда не знаю.. )
Для того, чтобы плагин дебажить его сначала надо зарегистрировать.
Что говорит плагин регистратор при попытке регистрации?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit

Последний раз редактировалось a33ik; 08.05.2009 в 12:50.
Старый 08.05.2009, 13:05   #6  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Цитата:
Сообщение от a33ik Посмотреть сообщение
Для того, чтобы плагин дебажить его сначала надо зарегистрировать.
Что говорит плагин регистратор при попытке регистрации?

В Plagin Registration Tool нажимаю Register -> Register New Assembly
Когда выбираю файл EditPriceList.dll (я его из папки Debug беру..в Release он тоже есть и еще там лежит файл key.snk.. Так и надо? )
Выскакивает ошибка "Unable to load PLugin Assembly" и текст
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, 13:15   #7  
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
Очень странно. За годичную практику такого не было у меня.
Ещё такой вопрос. Под каким фреймворком собираете плагин? Нужно под 2.0.

Гугл на вопрос по такой ошибке мне ничего не сказал...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Теги
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, время: 04:18.