Botframework Composer迁移2.x后Custom Action未在工厂注册报错
问题根因
该报错明确指向Bot Framework的声明式类型工厂无法识别你定义的Mycustomaction类型,核心原因是Composer 1.x到2.x做了架构调整:1.x支持自动扫描项目内的自定义Action实现自动注册,2.x废弃了该逻辑,改为基于Bot Components的显式注册机制,所以原有1.x的自定义Action配置全部失效。
解决步骤
第一步:校验自定义Action的代码规范
确保你的自定义Action类符合2.x的声明要求:- 必须继承自
Microsoft.Bot.Builder.Dialogs.Dialog基类 - 类上方必须添加
[DeclarativeType]特性,且特性内声明的类型名称和你报错的Mycustomaction完全一致(大小写敏感):
// 注意TypeName参数要和dialog文件里的$kind完全匹配 [Microsoft.Bot.Builder.Dialogs.Declarative.DeclarativeType("Mycustomaction")] public class Mycustomaction : Dialog { // 原有业务逻辑无需调整 }- 校验所有Bot Framework相关NuGet包版本统一,
Microsoft.Bot.Builder.Dialogs.Declarative包版本必须≥4.15.0,和项目内其他Bot相关包版本完全一致,避免版本冲突。如果是单独类库封装的自定义Action,要确保主机器人项目已经引用该类库,且类库的「复制到本地」属性为开启状态。
- 必须继承自
第二步:显式注册声明式类型
找到机器人项目的启动文件(.NET 6及以上找Program.cs,旧版本找Startup.cs),在注入Bot运行时的逻辑段添加自定义类型注册:// 原有注入Bot运行时的代码 services.AddBotRuntime(Configuration) // 新增行,注册自定义Action所在的组件,也可以直接注册单个类型 .RegisterDeclarativeTypes<Mycustomaction>();如果自定义Action数量较多,建议单独声明组件注册类统一管理:
public class CustomActionComponent : IComponentDeclarativeTypes { public IEnumerable<DeclarativeType> GetDeclarativeTypes(ResourceExplorer resourceExplorer) { // 所有自定义Action都在这里统一注册 yield return new DeclarativeType<Mycustomaction>("Mycustomaction"); yield return new DeclarativeType<OtherCustomAction>("OtherCustomAction"); } public IEnumerable<JsonConverter> GetConverters(ResourceExplorer resourceExplorer, ISourceResolver sourceResolver) { // 无自定义Json转换器直接返回空即可 return Enumerable.Empty<JsonConverter>(); } }注册时直接添加整个组件即可:
services.AddBotRuntime(Configuration) .AddComponent<CustomActionComponent>();第三步:校验Dialog文件配置
打开用到该自定义Action的.dialog文件,找到$kind字段,确保它的取值和你DeclarativeType里声明的名称完全一致,没有拼写、大小写错误。第四步:清理缓存重启
删除项目根目录下的bin、obj文件夹,关闭Composer后删除本地缓存目录:- Windows:
%AppData%\BotFrameworkComposer\cache - Mac/Linux:
~/.config/BotFrameworkComposer/cache
重新编译项目后启动机器人即可生效。
- Windows:
内容的提问来源于stack exchange,提问作者foobarbaz
相关产品推荐
相关产品推荐

