コード生成ツール用の拡張機能の作成

追加のコマンドライン パラメーターとパラメーター値を指定することで、コード生成ツールの機能を拡張できます。 パラメーターを指定するには、コマンド ラインに以下を追加します: /<parametername>:<class name>,<assembly name>。 アセンブリ名に .dll 拡張子を含めないことに注意してください。 別の方法として、同等の値を構成ファイルに “<add key=”<parametername>” value=”<class name>,<assembly name>” />” 形式で追加することもできます。

使用できるパラメーターを次の表に示します。

パラメーター名 インターフェイス名 内容
/codecustomization ICustomizeCodeDomService CodeDOM の生成が完成した後で呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。 候補リスト内の定数など、追加のクラスを生成するには便利です。
/codewriterfilter ICodeWriterFilterService 特定のオブジェクトまたはプロパティを生成するかどうかを判断するために CodeDOM の生成中に呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。
/codewritermessagefilter ICodeWriterMessageFilterService 特定のメッセージを生成するかどうかを判断するために CodeDOM の生成中に呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。 Microsoft.Crm.Sdk.Proxy.dll および Microsoft.Xrm.Sdk.dll で既に生成済みであるため、これは要求/応答で使用しないでください。
/metadataproviderservice IMetadataProviderService サーバーからメタデータを取得するために呼び出されます。 生成プロセス中に複数回呼び出されることがあるため、データはキャッシュに保存する必要があります。
/codegenerationservice ICodeGenerationService CodeDOM 生成の中心的な実装部分。 これを変更した場合、他の拡張機能が説明どおりに動作しなくなる可能性があります。
/namingservice INamingService オブジェクトの名前を確認するために CodeDOM 生成中に呼び出されます (既定の実装を使用すると仮定します)。

これらのインターフェイスの実装には、次のいずれかのコンストラクターが含まれる必要があります。

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

Microsoft.Crm.Services.Utility 名前空間は、CrmSvcUtil.exe で定義されています。 CrmSvcUtil.exe の参照を Visual Studio コード生成ツール拡張機能プロジェクトに追加します。

選択肢 (オプションセット) の列挙を生成するためのサンプル拡張

次のコード例は、拡張機能の作成方法を示しています。

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);
    }
}

CrmSvcUtilExtensions および GeneratePickListEnums サンプルをダウンロードします。

GeneratePicklistEnums サンプル拡張機能は、すべてのオプション セット、状態コード、およびステータス コードの列挙を含むソース コード ファイルを出力します。 これらの列挙を使用する方法の例については、SampleCode\CS\QuickStart サンプルを参照してください。

これには、すべての標準の値で生成された列挙体を格納するヘルパー コード ファイルも含まれています。 これらの列挙体をコード内で使用するには、SampleCode\CS\HelperCode\OptionSets.cs ファイルまたは SampleCode\VB\HelperCode\OptionSets.vb ファイルをプロジェクトに追加します。

各列挙体を使用して、プロパティの値をテストまたは設定することができます。 通常、このプロパティはテーブル列 (エンティティ属性) ですが、他のプロパティに使用されるものもいくつかあります。

使用例

次の例は、これらの列挙の1つを使用してアカウントに値を設定する方法を示しています。

// 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);

関連情報

.NET 用 SDK の事前バインド クラスを生成する

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。