yulianshui 2014-03-05 10:09 采纳率: 0%
浏览 1375

c#调用pjsip 的 c++ dll 没有参数正常,但是有参数的时候就报错

pjsip 的 c++ dll ,按照文档里面的参数设置来传递参数,但是,在按照P/invoke 方式进行获取,但是运行的结果是,没有参数的都能正常运行,有参数的却报错,错误是这样的

对 PInvoke 函数“dllTest!dllTest.Program::dll_makeCall”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

代码如下
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace dllTest
{
class Program
{
///
/// 初始化
///
///
[DllImport("pjsipDll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int dll_init();
///
/// 主函数
///
///
[DllImport("pjsipDll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int dll_main();

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    [DllImport("pjsipDll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int dll_getNumOfCodecs();
    /// <summary>
    /// 打电话
    /// </summary>
    /// <param name="accountId">用户名</param>
    /// <param name="uri">地址</param>
    /// <returns></returns>
    [DllImport("pjsipDll.dll", EntryPoint = "dll_makeCall")]
    private static extern int dll_makeCall(int accountId, string uri);
    /// <summary>
    /// 回电话
    /// </summary>
    /// <param name="callId"></param>
    /// <param name="code"></param>
    /// <returns></returns>
    [DllImport("pjsipDll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int dll_answerCall(int callId, int code);
    /// <summary>
    /// 
    /// </summary>
    /// <param name="callId"></param>
    /// <returns></returns>
    [DllImport("pjsipDll.dll", EntryPoint = "dll_releaseCall", CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int dll_releaseCall(int callId);

    static void Main(string[] args)
    {
        try
        {          
            dll_init();
            dll_main();
            string uri = "sip:bob@192.168.91.128:5060";
            int sessionID = dll_makeCall(0, uri);
            Console.WriteLine(sessionID > 0 ? "成功" : "失败" + "----->SessionID:" + sessionID);
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return;
        }

    }
}

}

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-08 00:32
    关注

    该回答引用ChatGPT

    根据错误提示信息,可能是 PInvoke 签名与非托管的目标签名不匹配所导致的。建议检查一下非托管 DLL 的函数签名是否与 C# 中的 PInvoke 签名匹配。另外,在调用有参数的 PInvoke 函数时,需要确保传递的参数类型和顺序与非托管 DLL 的函数签名一致。


    在这里,可以先检查一下 dll_makeCall 的 PInvoke 签名是否正确。比如,可以检查一下 dll_makeCall 在 C++ DLL 中的定义以及参数类型和顺序是否与 C# 中的 PInvoke 签名一致。如果签名一致,再检查一下在调用 dll_makeCall 时传递的参数类型和顺序是否与签名一致。


    同时,根据代码中的注释,dll_makeCall 的入口点是 dll_makeCall 而不是默认的 _dll_makeCall@8,因此需要在 PInvoke 签名中指定入口点名称,可以尝试修改 EntryPoint 的值为 "dll_makeCall"。


    另外,建议使用调试器进行调试,以便更准确地定位错误所在。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)