Compartir a través de


Creación de extensiones para la herramienta de generación de código

Puede ampliar la funcionalidad de la herramienta de generación de código especificando parámetros de línea de comandos y valores de parámetros adicionales. Para especificar un parámetro, agregue lo siguiente a la línea de comandos:

<*parametername*>:<*class name*>,<*assembly name*>

Tenga en cuenta que el nombre del ensamblado no incluye la extensión .dll. Como alternativa, puede agregar el valor equivalente al archivo de configuración en el formato:

<add key="<*parametername*>" value="<*class name*>,<*assembly name*>" />

En la tabla siguiente se enumeran los parámetros que puede utilizar.

Nombre del parámetro Nombre de la interfaz Descripción
codecustomization ICustomizeCodeDomService Se llama una vez finalizada la generación de CodeDOM, suponiendo que se trata de la instancia predeterminada de ICodeGenerationService. Es útil para generar clases adicionales, como las constantes en las listas de selección.
codewriterfilter ICodeWriterFilterService Se llama durante el proceso de generación de CodeDOM, asumiendo la instancia predeterminada de ICodeGenerationService, para determinar si se debe generar un objeto o propiedad específicos.
codewritermessagefilter ICodeWriterMessageFilterService Se llama durante el proceso de generación de CodeDOM, asumiendo la instancia predeterminada de ICodeGenerationService, para determinar si se debe generar un mensaje específico. Esto no debe usarse para solicitudes/respuestas, ya que estas ya se generan en Microsoft.Crm.Sdk.Proxy.dll y Microsoft.Xrm.Sdk.dll.
metadataproviderservice IMetadataProviderService Se le llama para recuperar los metadatos del servidor. Esto se puede llamar varias veces durante el proceso de generación, por lo que los datos deben almacenarse en caché.
codegenerationservice ICodeGenerationService Implementación principal de la generación de CodeDOM. Si esto se cambia, es posible que las otras extensiones no se comporten de la manera descrita.
namingservice INamingService Se llama durante la generación de CodeDOM para determinar el nombre de los objetos, asumiendo la implementación predeterminada.

La implementación de estas interfaces debe tener uno de los siguientes constructores:

MyNamingService()
MyNamingService(INamingService defaultService)
MyNamingService(IDictionary<string, string> parameters)
MyNamingService(INamingService defaultService, IDictionary<string, string> parameters)

El espacio de nombres Microsoft.Crm.Services.Utility se define en CrmSvcUtil.exe. Agregue una referencia a CrmSvcUtil.exe en los proyectos de extensión de la herramienta de generación de código de Visual Studio.

Extensión de ejemplo para generar enumeraciones para opciones (conjuntos de opciones)

En el siguiente código de ejemplo se muestra cómo escribir una extensión.

using System;

using Microsoft.Crm.Services.Utility;
using Microsoft.Xrm.Sdk.Metadata;

/// <summary>
/// Sample extension for the CrmSvcUtil.exe tool that generates early-bound
/// classes for custom entities.
/// </summary>
public sealed class BasicFilteringService : ICodeWriterFilterService
{
    public BasicFilteringService(ICodeWriterFilterService defaultService)
    {
        this.DefaultService = defaultService;
    }

    private ICodeWriterFilterService DefaultService { get; set; }

    bool ICodeWriterFilterService.GenerateAttribute(AttributeMetadata attributeMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateAttribute(attributeMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateEntity(EntityMetadata entityMetadata, IServiceProvider services)
    {
        if (!entityMetadata.IsCustomEntity.GetValueOrDefault()) { return false; }
        return this.DefaultService.GenerateEntity(entityMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateOption(OptionMetadata optionMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateOption(optionMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateOptionSet(OptionSetMetadataBase optionSetMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateOptionSet(optionSetMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateRelationship(RelationshipMetadataBase relationshipMetadata, EntityMetadata otherEntityMetadata,
    IServiceProvider services)
    {
        return this.DefaultService.GenerateRelationship(relationshipMetadata, otherEntityMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateServiceContext(IServiceProvider services)
    {
        return this.DefaultService.GenerateServiceContext(services);
    }
}

Descargue el ejemplo: CrmSvcUtilExtensions y GeneratePickListEnums.

La extensión de ejemplo GeneratePicklistEnums genera un archivo de código fuente que contiene enumeraciones para todos los conjuntos de opciones, códigos de estado y códigos de estatus.

Cada enumeración se puede usar para probar o establecer el valor de una propiedad. Normalmente, esta propiedad es una columna de tabla (atributo de entidad), pero hay algunas que se utilizan para otras propiedades.

Ejemplo de uso

En el ejemplo siguiente se muestra cómo usar una de estas enumeraciones para establecer un valor en una cuenta.

// Instantiate an account object. Note the use of the option set enumerations defined
// in OptionSets.cs.
Account account = new Account { Name = "Fourth Coffee" };
account.AccountCategoryCode = new OptionSetValue((int)AccountAccountCategoryCode.PreferredCustomer);
account.CustomerTypeCode = new OptionSetValue((int)AccountCustomerTypeCode.Investor);

// Create an account record named Fourth Coffee.
// Save the record reference so we can delete it during cleanup later.
Guid accountId = service.Create(account);

Véase también

Crear las clases de entidad con enlace en tiempo de compilación con la herramienta de generación de código