Crear 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 comando: /<parametername>:<class name>,<assembly name>. Tenga en cuenta que el nombre del ensamblado no incluye la extensión .dll. Como alternativa, también puede agregar el valor equivalente al archivo de configuración con el formato “<add key=”<parametername>” value=”<class name>,<assembly name>” />”.

En la siguiente tabla se muestran los parámetros que puede usar.

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 de las listas desplegables.
/codewriterfilter ICodeWriterFilterService Se llama durante el proceso de generación de CodeDOM, suponiendo que se trata de la instancia predeterminada de ICodeGenerationService, para determinar si debe generarse una propiedad o un objeto específico.
/codewritermessagefilter ICodeWriterMessageFilterService Se llama durante el proceso de generación de CodeDOM, suponiendo que se trata de la instancia predeterminada de ICodeGenerationService, para determinar si debe generarse un mensaje específico. Esto no se recomienda para las solicitudes y respuestas pues 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. La llamada puede realizarse varias veces durante el proceso de generación, por lo que los datos se deben almacenar en caché.
/codegenerationservice ICodeGenerationService Implementación principal de la generación de CodeDOM. Si se cambia, las otras extensiones pueden no comportarse de la manera descrita.
/namingservice INamingService Se llama durante la generación de CodeDOM para determinar el nombre de los objetos, suponiendo que se trata de la implementación predeterminada.

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

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 muestra para generar enumeraciones para opciones (conjuntos de opciones)

El siguiente código de ejemplo 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 crea un archivo de código fuente que contiene enumeraciones para todos los conjuntos de opciones y códigos de estado. Para obtener un ejemplo de cómo usar estas enumeraciones, vea el ejemplo de SampleCode\CS\QuickStart.

Además, incluye un archivo de código auxiliar que contiene las enumeraciones generadas por todos los valores estándar. Estas enumeraciones se pueden usar en el código agregando el archivo SampleCode\CS\HelperCode\OptionSets.cs o SampleCode\VB\HelperCode\OptionSets.vb al proyecto.

Cada enumeración se pueda 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

El siguiente ejemplo muestra cómo utilizar 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);

Consulte también

Generar clases de enlace en tiempo de compilación para SDK para .NET

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).