You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:07:42