C# 扩展 Dynamics 365 Copilot:自定义插件与场景实战
Dynamics 365 Copilot 作为基于 AI 的智能助手,为企业用户提供了自动化流程、智能分析和自然语言交互的能力。不过,通用功能往往无法满足特定行业或企业的定制化需求。要实现这一点,关键在于通过 C# 编写自定义插件,扩展 Dynamics 365 Copilot 的能力,并结合实际业务场景实现定制化 AI 交互。
架构基础
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 生成结构化、个性化的回复(而非通用话术)。
代码实现
插件核心逻辑
这是插件的入口类,继承 IPlugin 接口。执行方法负责获取上下文、校验参数、查询数据并构建响应。
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;
using System.Text;
// 插件入口类,继承 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 = 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
{
=> ,
=> ,
=> ,
=> ,
=> ,
=> ,
_ =>
};
}
}

