升级Microsoft.Bot.Builder.LanguageGeneration至4.15.0出现fromFile()报错
Microsoft.Bot.Builder.LanguageGeneration 4.15.0 fromFile()报错解决方案
根因说明
Microsoft.Bot.Builder.LanguageGeneration 4.15.0版本对内置函数库做了重构调整,fromFile() 已经从官方默认内置函数列表中移除,不再原生支持,因此LG表达式解析时会识别为未定义函数,抛出如下错误:
/UnitTests/bin/Debug/net5.0/Resources/Lg/General.lg line 25:2 - line 25:39: Error occurred when parsing expression 'fromFile('../Cards/HelpCard.json')'. fromFile does not have an evaluator, it's not a built-in function or a custom function.
可行修复方案
- 方案1:自定义注册
fromFile函数,兼容原有逻辑
初始化LG解析器时手动注册同名自定义函数,实现和原有内置函数一致的文件读取逻辑即可,C#示例代码如下:// 定义自定义函数集合 var customFunctions = new Dictionary<string, Delegate> { { "fromFile", (Func<string, object>)(relativePath => { // 按照项目实际的路径解析规则调整,这里以应用根目录为基准路径示例 var absolutePath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, relativePath)); // 可按需添加异常捕获、路径安全校验逻辑 return File.ReadAllText(absolutePath); }) } }; // 解析LG文件时传入自定义函数参数 var templates = Templates.ParseFile("你的LG文件路径", customFunctions: customFunctions); - 方案2:替换LG文件中的
fromFile调用
如果使用fromFile的场景很少,可以直接把调用位置替换为内联的JSON内容,也可以提前在业务代码中读取对应文件内容,作为参数传入LG模板,避免在LG表达式中做文件读取操作。 - 方案3:临时锁定版本
如果你没有必须使用4.15.0版本的特性需求,可以先将Microsoft.Bot.Builder.LanguageGeneration包版本锁定在4.14.1,待后续官方推出替代方案后再做升级。
注意事项
自定义实现fromFile函数时,建议添加路径合法性校验,避免出现路径遍历的安全风险,同时注意文件读取的编码格式和项目保持一致,避免返回内容乱码。
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

