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 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable