如何在Visual Studio中通过C#修改CANoe信号值并解决DBTypeNotFoundException报错
外部C#程序修改CANoe信号值报错解决方案
报错原因
你当前使用的Vector.CANoe.Runtime下的强类型信号访问能力、[OnChange]特性均为CANoe进程内专属API,仅支持在CANoe内部加载的测试模块、面板插件中运行。你从Visual Studio直接启动的是独立外部进程,CANoe Runtime无法关联到已加载的数据库上下文,就会抛出类型找不到的异常:
Vector.CANoe.Runtime.Internal.DBTypeNotFoundException: 'The type SignalName could not be found in the configuration.'
解决方案
改用CANoe提供的COM API实现外部进程控制,操作步骤如下:
- 第一步:在Visual Studio项目的引用管理器中,找到对应版本的
CANoe x.x Object LibraryCOM组件并添加引用,x为你本地安装的CANoe主版本号 - 第二步:替换原有访问逻辑,使用COM接口读写信号,参考代码如下:
using System; using CANoe; namespace Demo { class Program { static void Main(string[] args) { // 连接本地运行的CANoe实例 Application canoeApp = new CANoe.Application(); // 可选:如果需要代码自动启动CANoe加载配置,取消下方注释即可,路径替换为你的cfg文件实际路径 // canoeApp.Open(@"D:\CANoe_Config\YourConfig.cfg", true, true); // canoeApp.Measurement.Start(); // 按[总线名, 报文名, 信号名]获取信号对象,参数要和CANoe数据库中定义完全一致,大小写敏感 Signal welcomeLightSignal = canoeApp.GetSignal("CAN", "PAAK_MSG", "PAAK_WELCOME_LIGHTS"); // 读取信号值 double currentVal = (double)welcomeLightSignal.Value; Console.WriteLine($"当前信号值:{currentVal}"); // 修改信号值 welcomeLightSignal.Value = 1; Console.WriteLine("信号值已设置为1"); // 释放COM资源 System.Runtime.InteropServices.Marshal.ReleaseComObject(welcomeLightSignal); System.Runtime.InteropServices.Marshal.ReleaseComObject(canoeApp); } } }
注意事项
- 运行代码前请确保CANoe已加载包含目标信号的配置,且测量处于启动状态,如果是发送信号需要对应通道处于激活状态
- 信号的总线名、报文名、信号名必须和CANoe数据库中的配置完全匹配,大小写敏感
- 如果需要监听信号变化,可绑定
Signal.OnChange事件实现回调,不需要使用原有[OnChange]特性,该特性仅在CANoe内部编译时生效
内容的提问来源于stack exchange,提问作者Horia-Andrei CIULICA
相关产品推荐
相关产品推荐

