.NET Core 6中AGIScript移至类库项目后无法监听Asterisk问题
解决AsterNET AGI监听器移类库后无法启动的问题
问题原因
当MyAgi类在桌面应用项目(项目A)内时,AsterNET的GeneralMappingStrategy可以通过HI.agiSample.MyAgi这个类名在当前执行程序集中找到对应的类型。但将类移到独立类库(项目B)后,仅用命名空间+类名的方式无法定位到类所在的程序集,导致AsterNET无法加载AGIScript实现类,最终监听器启动失败。
解决方案
1. 使用完整程序集限定名配置ScriptMapping
修改ScriptClass的值为类的完全限定名+程序集名称,格式为[命名空间.类名], [类库程序集名称]。
假设你的类库项目B的程序集名称是HI.agiSample.Library,修改后的代码如下:
public void ListenToAgi() { var agi = new AsteriskFastAGI(); agi.MappingStrategy = new GeneralMappingStrategy(new List<ScriptMapping>() { new ScriptMapping() { // 替换为你的类库实际程序集名称 ScriptClass = "HI.agiSample.MyAgi, HI.agiSample.Library", ScriptName = "getvariable" } }); agi.Start(); }
2. 验证类库引用与输出
- 确认项目A已正确添加项目B的项目引用(而非文件引用),确保编译时类库dll会被复制到项目A的输出目录。
- 检查
MyAgi类的访问修饰符为public(你的代码已满足此要求)。
3. 动态获取程序集限定名(可选)
如果不想硬编码程序集名称,可以通过反射动态获取类的完整限定名,避免手动输入出错:
public void ListenToAgi() { var agi = new AsteriskFastAGI(); // 动态获取MyAgi的完整程序集限定名 string scriptClassFullName = typeof(HI.agiSample.MyAgi).AssemblyQualifiedName; agi.MappingStrategy = new GeneralMappingStrategy(new List<ScriptMapping>() { new ScriptMapping() { ScriptClass = scriptClassFullName, ScriptName = "getvariable" } }); agi.Start(); }
排查技巧
在agi.Start()处添加异常捕获,查看具体错误信息,确认是否为类型加载失败:
try { agi.Start(); } catch (Exception ex) { Console.WriteLine($"启动AGI监听器失败:{ex.ToString()}"); }
如果抛出TypeLoadException,则完全符合上述原因,按解决方案调整即可。
内容的提问来源于stack exchange,提问作者AminRostami
相关产品推荐
相关产品推荐

