Dynamics 365 Copilot 作为基于 AI 的智能助手,为企业用户提供了自动化流程、智能分析和自然语言交互的能力,但通用功能往往无法满足特定行业或企业的定制化需求。本文将详细介绍如何通过 C# 编写自定义插件,扩展 Dynamics 365 Copilot 的能力,并结合实际业务场景实现定制化 AI 交互。
一、核心基础:Dynamics 365 Copilot 扩展架构
Dynamics 365 Copilot 的扩展主要依赖于 Power Platform 插件框架 和 Copilot Studio 的自定义连接器,核心技术栈包括:
- C# (.NET Framework 4.8 或 .NET 6+):编写业务逻辑插件
- Dynamics 365 SDK:与 Dataverse 数据交互
- Azure OpenAI / 自定义 LLM 接口:扩展 AI 生成能力
- Power Platform 注册工具:部署插件到 Dynamics 365 环境
扩展的核心逻辑是:通过 C# 插件拦截 Copilot 的交互请求,注入自定义业务规则,调用外部 AI 服务或 Dataverse 数据,最终返回定制化的 AI 响应。
二、环境准备
- 安装必备工具:
- Visual Studio 2022(带 .NET 桌面开发和 Azure 开发工作负载)
- Dynamics 365 SDK(最新版本)
- Power Platform CLI(用于插件注册)
- 有效的 Dynamics 365 环境(带 Copilot 启用权限)
创建 Dynamics 365 插件项目:
# 通过 Power Platform CLI 创建插件项目
pac plugin init --name CopilotCustomPlugin --template ClassLibrary
三、核心示例:自定义客户服务 Copilot 插件
场景描述
某零售企业需要定制 Copilot 能力:当用户通过 Copilot 查询客户订单状态时,Copilot 能自动从 Dataverse 中读取该客户的订单数据,并结合 AI 生成结构化、个性化的回复(而非通用话术)。
核心源代码实现
1. 插件核心类(CustomerOrderCopilotPlugin.cs)
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;
// 插件入口类,继承 IPlugin 接口
public class CustomerOrderCopilotPlugin : IPlugin {
// 插件执行方法(核心入口)
public void Execute(IServiceProvider serviceProvider) {
// 1. 获取插件执行上下文
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService((IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService((IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
{
customerId = context.InputParameters[]?.ToString();
queryType = context.InputParameters[]?.ToString();
(.IsNullOrEmpty(customerId) || queryType != ) {
InvalidPluginExecutionException();
}
orderData = GetCustomerOrders(service, customerId);
copilotResponse = BuildCopilotResponse(orderData);
context.OutputParameters[] = copilotResponse;
} (Exception ex) {
InvalidPluginExecutionException( + ex.Message, ex);
}
}
{
QueryExpression query = QueryExpression() {
ColumnSet = ColumnSet(, , , , ),
Criteria = FilterExpression {
Conditions = { ConditionExpression(, ConditionOperator.Equal, Guid(customerId)) }
},
Orders = { OrderExpression(, OrderType.Descending) }
};
service.RetrieveMultiple(query);
}
{
(orders.Entities.Count == ) {
;
}
responseBuilder = System.Text.StringBuilder();
responseBuilder.AppendLine();
( order orders.Entities) {
orderName = order[].ToString();
orderStatus = GetOrderStatusText(order.GetAttributeValue<OptionSetValue>().Value);
totalAmount = order.GetAttributeValue<Money>().Value;
DateTime createDate = order.GetAttributeValue<DateTime>();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
}
responseBuilder.AppendLine();
responseBuilder.ToString();
}
{
statusCode {
=> ,
=> ,
=> ,
=> ,
=> ,
=> ,
_ =>
};
}
}

