Попытка метода x получить доступ к методу y не удалась - PullRequest
0 голосов
/ 31 октября 2018

Я должен написать кодовую базу на другом коде. Это плагин для Dynamic CRM 2011. В любом случае, я хочу заменить этот плагин на существующий Plugin. Это почти зеркало другого .dll Plugin. В любом случае, в настройке CRM я отключил все шаги предыдущего Plugin и хочу вставить новый плагин через регистрацию плагинов. Я строю свою библиотеку классов через VS, VS создает файл .dll в папке /bin/Debug проекта. Я выбираю вставить тот .dll как Зарегистрировать новую сборку. Я выбрал Sandbox в качестве режима изоляции. А затем база данных как местоположение (не Disk или GAC). Он успешно обновил мой выбранный плагин. После этого я вставляю свои шаги (как и предыдущий плагин, которым я хочу заменить). Но в одном из методов создания я получаю эту ошибку:

    Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault,
         Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: 
        Unexpected exception from plug-in (Execute): OrderReceiptStepPlugin: System.MethodAccessException:
         Attempt by method 'Microsoft.Xrm.Sdk.Entity.ToEntity<System.__Canon>()' to access method 'StepType..ctor()' failed.Detail: 
        <OrganizationServiceFault xmlns:i="www.w3.org/.../XMLSchema-instance" 
        xmlns="schemas.microsoft.com/.../Contracts">
          <ErrorCode>-2147220956</ErrorCode>
          <ErrorDetails xmlns:d2p1="schemas.datacontract.org/.../System.Collections.Generic" />
          <Message>Unexpected exception from plug-in (Execute): OrderReceiptStepPlugin: System.MethodAccessException: 
        Attempt by method 'Microsoft.Xrm.Sdk.Entity.ToEntity&lt;System.__Canon&gt;()' to access method 'StepType..ctor()' failed.</Message>
          <Timestamp>xxxxxxxxxx.4628797Z</Timestamp>
          <InnerFault i:nil="true" />
          <TraceText>

[OrderReceiptStep: OrderReceiptStepPlugin]
[xxxxxx-xxxx-xxxx11-xxx-xxxxxxxxxxxx: OrderReceiptStepPlugin: Create of bmsd_orderreceiptstep]

Entered .Execute(), Correlation Id: 47c5ddcb-9290-4945-9ac0-fd88925480b1, Initiating User: 5b6b27be-ca0f-e811-bebe-000c2964dd77
 is firing for Entity: bmsd_orderreceiptstep, Message: Create, Correlation Id: 47c5ddcb-9290-4945-9ac0-fd88925480b1, Initiating User: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
Exiting .Execute(), Correlation Id: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Initiating User: xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx


</TraceText>
</OrganizationServiceFault>

Я погуглил по поводу MethodAccessException Узнайте, что этот метод происходит из-за .Net версии 4 и новее, И некоторый код, который вы можете добавить в свой Assebmly.cs, чтобы избежать этого исключения, согласно этой теме. Но в моем случае безуспешно. Я добавил следующий код в файл assembly.cs, но безуспешно:

    [assembly: SecurityTransparent()]
[assembly: AllowPartiallyTrustedCallersAttribute]

Вот код, вызывающий ошибку. Он находится в предсоздании пользовательского объекта:

  private void OrderReceiptStepPreCreateEventHandler(LocalPluginContext context)
{
    SalesOrderReceiptStepRepository salesOrderReceiptStepRepository = new SalesOrderReceiptStepRepository(context);
    SalesOrderReceiptStep salesOrderReceiptStep = salesOrderReceiptStepRepository.CreateInstance();
    salesOrderReceiptStep.TotalAmountWithoutTax = new Money(salesOrderReceiptStep.TotalAmountWithoutTax.Value + salesOrderReceiptStep.FreightAmount.Value);
    salesOrderReceiptStep.TotalAmountWithoutTax = new Money(salesOrderReceiptStep.TotalAmountWithoutTax.Value - salesOrderReceiptStep.DiscountAmount.Value);
    switch (salesOrderReceiptStep.ReceiptStepType)
    {
        case ReceiptStepType.TimeOriented:
        case ReceiptStepType.PrePayment:
        case ReceiptStepType.Others:
            salesOrderReceiptStep.TotalAmountWithoutTax = new Money(salesOrderReceiptStep.TotalDetailAmount.Value + salesOrderReceiptStep.FreightAmount.Value - salesOrderReceiptStep.DiscountAmount.Value);
            salesOrderReceiptStep.TotalAmount = new Money(salesOrderReceiptStep.TotalAmountWithoutTax.Value + salesOrderReceiptStep.TotalTax.Value);
            break;
    }
    OrderReceiptStepCalculationPlugin orderReceiptStepCalculationPlugin = new OrderReceiptStepCalculationPlugin();
    orderReceiptStepCalculationPlugin.CreateORderReceiptStep(context, salesOrderReceiptStep);
    if (salesOrderReceiptStep.Contains("bmsd_totallineitemamount") && salesOrderReceiptStep.Contains("bmsd_orderid"))
    {
        EntityReference attributeValue = salesOrderReceiptStep.GetAttributeValue<EntityReference>("bmsd_orderid");
        if (attributeValue != null)
        {
            SalesOrderAdapter salesOrderAdapter = new SalesOrderAdapter();
            OrganizationServiceContext context2 = new OrganizationServiceContext(context.OrganizationService);
            Entity ordersById = salesOrderAdapter.GetOrdersById(context2, attributeValue.Id);
            if (ordersById != null)
            {
                CalculationHelper calculationHelper = new CalculationHelper();
                Entity entity = calculationHelper.CalculateOrdersAndReturnEntity(context, ordersById, ordersById);
                entity.Attributes["statuscode"] = null;
                entity.Attributes["statecode"] = null;
                context.OrganizationService.Update(entity);
            }
        }
    }
    if (salesOrderReceiptStep.Contains("bmsd_invoiceid") || salesOrderReceiptStep.Contains("statuscode") || salesOrderReceiptStep.Contains("statecode") || salesOrderReceiptStep.Contains("bmsd_totallineitemamount"))
    {
        EntityReference attributeValue2 = salesOrderReceiptStep.GetAttributeValue<EntityReference>("bmsd_invoiceid");
        if (attributeValue2 != null)
        {
            OrganizationServiceContext context2 = new OrganizationServiceContext(context.OrganizationService);
            OrderReceiptItemAdapter orderReceiptItemAdapter = new OrderReceiptItemAdapter();
            Entity invoiceById = orderReceiptItemAdapter.GetInvoiceById(context2, attributeValue2.Id);
            if (invoiceById != null)
            {
                CalculationHelper calculationHelper = new CalculationHelper();
                Entity entity2 = calculationHelper.CalculateInvoiceAndReturnEntity(context, invoiceById, invoiceById);
                entity2.Attributes["statuscode"] = null;
                entity2.Attributes["statecode"] = null;
                context.OrganizationService.Update(entity2);
            }
        }
    }
}

Я знаю, что это не синтаксическая или логическая ошибка в разработке (потому что зеркало работает правильно). Какие еще причины могут сделать эту ошибку? Также здесь есть класс, который исключение выдает из этого, он также содержит метод Выполнить:

    public void Execute(IServiceProvider serviceProvider)
{
    if (serviceProvider == null)
    {
        throw new ArgumentNullException("serviceProvider");
    }
    LocalPluginContext localcontext = new LocalPluginContext(serviceProvider);
    localcontext.Trace(string.Format(CultureInfo.InvariantCulture, "Entered {0}.Execute()", new object[1]
    {
        ChildClassName
    }));
    try
    {
        Action<LocalPluginContext> action = (from a in RegisteredEvents
                                             where a.Item1 == localcontext.PluginExecutionContext.Stage && a.Item2 == localcontext.PluginExecutionContext.MessageName &&
                                             (string.IsNullOrWhiteSpace(a.Item3) || a.Item3 == localcontext.PluginExecutionContext.PrimaryEntityName)
                                             select a.Item4).FirstOrDefault();
        if (action != null)
        {
            localcontext.Trace(string.Format(CultureInfo.InvariantCulture, "{0} is firing for Entity: {1}, Message: {2}", new object[3]
            {
                ChildClassName,
                localcontext.PluginExecutionContext.PrimaryEntityName,
                localcontext.PluginExecutionContext.MessageName
            }));
            action(localcontext);
        }
    }
    catch (FaultException<OrganizationServiceFault> ex)
    {
        localcontext.Trace(string.Format(CultureInfo.InvariantCulture, "Exception: {0}", new object[1]
        {
            ex.ToString()
        }));
        throw;
    }
    finally
    {
        localcontext.Trace(string.Format(CultureInfo.InvariantCulture, "Exiting {0}.Execute()", new object[1]
        {
            ChildClassName
        }));
    }
}
...