.NET 4.8运行工作流创建Jira时遇异常及文件查找问题
.NET 4.8 + VS2017 遗留工作流代码创建Jira时的系列问题及解决思路
一、初始异常:无法识别自定义工作流活动类型
Unable to create unknown type '{clr-namespace:Services.Modules.Asv.Workflows;assembly=Oddo.Services.Middleware.Modules.Asv.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}GetTicketByIdActivityAsync'
line number '110' and line position '16'.
解决方向:
- 检查
Oddo.Services.Middleware.Modules.Asv.Business程序集是否已正确引用到当前项目,确保版本、PublicKeyToken与XAML中声明的完全一致 - 确认
GetTicketByIdActivityAsync类的命名空间确实是Services.Modules.Asv.Workflows,无拼写错误 - 验证该类是否为
public访问修饰符,且继承自正确的工作流基类(如AsyncCodeActivity) - 若该程序集是本地项目,确认已成功编译,输出目录中存在对应的dll文件
二、XAML文件查找逻辑导致activityDefs始终为空
问题代码:
var activityDefs = Directory.GetFiles(".", "*.xaml", SearchOption.AllDirectories).Where(item => item.Equals(".\\CreateJiraMoboVLI.xaml")); if (activityDefs == null) { Logger.Error($"the activityDefs was null "); throw new ArgumentNullException(nameof(activityDefs)); }
问题原因与修复:
Directory.GetFiles返回的是带路径的完整文件名,直接用Equals(".\\CreateJiraMoboVLI.xaml")匹配永远不会成功- 修复后的代码:仅匹配文件名,同时修正无效的null判断(LINQ返回的
IEnumerable永远不为null,需判断是否为空集合)
var activityDefs = Directory.GetFiles(".", "*.xaml", SearchOption.AllDirectories) .Where(item => Path.GetFileName(item).Equals("CreateJiraMoboVLI.xaml", StringComparison.OrdinalIgnoreCase)); if (!activityDefs.Any()) { Logger.Error("未找到目标XAML文件:CreateJiraMoboVLI.xaml"); throw new FileNotFoundException("指定的工作流XAML文件不存在", "CreateJiraMoboVLI.xaml"); }
- 额外检查:确认XAML文件的生成操作设置为
Content(确保文件被复制到输出目录),或根据业务需求设置为WorkflowDefinition
三、清理重建后的新错误
错误提示:未能加载文件或程序集“Oddo.Services.Middleware.Modules.Asv.Business”或它的某一个依赖项。系统找不到指定的文件。
解决方向:
- 检查输出目录(如bin/Debug)中是否存在
Oddo.Services.Middleware.Modules.Asv.Business.dll,若不存在,重新编译该依赖项目 - 确认项目引用中该程序集的“复制本地”属性已设置为
True,确保编译时自动复制到输出目录 - 使用**程序集绑定查看器(fuslogvw.exe)**跟踪程序集加载失败的具体原因,排查依赖项缺失或版本不匹配问题
- 手动删除解决方案下所有bin、obj目录,清理NuGet缓存后重新完整编译
内容的提问来源于stack exchange,提问作者Youssef Boudaya
相关产品推荐
相关产品推荐

