使用Dapper插入数据时Autodesk Navisworks插件崩溃求助
我之前在开发Navisworks插件时也碰到过类似的第三方库兼容性问题,结合你的场景,给你几个具体的排查方向:
1. 检查Dapper与Navisworks的.NET框架兼容性
Navisworks多数版本基于**.NET Framework 4.7.2**运行,而新版Dapper可能默认针对.NET Core/.NET 5+编译,或者引入了旧框架不支持的API。
- 尝试降级Dapper到稳定的旧版本(比如2.0.x系列),确保安装的是针对.NET Framework的NuGet包
- 确认你的项目目标框架和Navisworks使用的版本完全一致
2. 排查线程上下文冲突
Navisworks的插件运行在严格的UI线程/插件执行上下文里,Dapper内部的异步操作或线程切换可能触发Navisworks的非托管代码崩溃:
- 把数据库操作强制包裹在Navisworks的主UI线程中执行:
Autodesk.Navisworks.Api.Application.MainWindow.Dispatcher.Invoke(() => { using (SqlConnection connection = new SqlConnection(NavisDbSettings.ConnectToDB().ConnectionString)) { connection.Open(); using (SqlTransaction transaction = connection.BeginTransaction()) { NavisTest navisTest = new NavisTest("Wall", "Concrete Wall 01"); connection.Execute(NavisDbSqlCommands.navisTestSql, navisTest, transaction: transaction); transaction.Commit(); } } });
- 避免长时间占用Navisworks的主线程,必要时拆分批量插入逻辑,加入短暂延迟
3. 验证参数映射的正确性
你的实体类属性是大写开头(Category/Family),但SQL参数是小写(@category/@family),虽然Dapper默认支持大小写不敏感映射,但在Navisworks的特殊环境下可能出现绑定失败:
- 显式指定参数,避免自动映射的不确定性:
connection.Execute(navisTestSql, new { Category = navisTest.Category, Family = navisTest.Family }, transaction: transaction);
- 或者修改SQL参数为大写
@Category/@Family,保持和实体类属性一致
4. 启用Dapper调试模式并禁用命令缓存
Dapper的命令缓存可能和Navisworks的插件隔离机制冲突,尝试禁用缓存并查看生成的SQL细节:
var command = new CommandDefinition( navisTestSql, parameters: navisTest, transaction: transaction, flags: CommandFlags.NoCache ); connection.Execute(command);
- 同时可以手动输出参数值,确认传递到数据库的内容是否正确
5. 捕获底层未处理异常
Navisworks是混合托管/非托管的程序,普通try-catch可能捕获不到非托管层面的异常,尝试全局捕获:
AppDomain.CurrentDomain.UnhandledException += (sender, e) => { var exception = e.ExceptionObject as Exception; // 将异常的完整调用栈和消息写入本地日志 File.WriteAllText(@"C:\temp\navis_dapper_error.log", exception?.ToString() ?? "Unknown crash"); };
- 打开Visual Studio的调试 -> 异常设置,勾选所有托管和非托管异常,调试时查看崩溃瞬间的具体异常信息
6. 检查插件的依赖加载
Navisworks对插件的依赖加载有严格限制,确保Dapper的dll和你的插件程序集在同一目录,或者通过NuGet正确打包所有依赖,避免Navisworks无法加载Dapper的依赖组件
内容的提问来源于stack exchange,提问作者Andrea Tassera
相关产品推荐
相关产品推荐

