在c# pt中调试DLLImport

本文关键字:调试 DLLImport pt | 更新日期: 2023-09-27 18:11:50

我正在使用MySQL嵌入式库并使用p/Invoke调用必要的函数来启动服务器。我们在这个主题中解决了一些问题,但是另一个问题又出现了。

mysql_server_init()函数成功返回0,错误返回1。不幸的是,在我的代码中,当它返回1时,我使用Marshal.GetLastWin32Error(),错误代码是0。我假设它没有拾取mysql_server_init()产生的错误,但我不知道如何找出问题所在。

这是相关的代码块…

    [DllImportAttribute("libmysqld.dll", SetLastError = true)]
    static extern int mysql_server_init(int argc, string[] argv, string[] groups);
    static string[] server_options = new string[2];
    static string[] server_groups = new string[3];
    public static bool Start()
    {
        server_options[0] = "mysql_test"; // not used?
        server_options[1] = "--defaults-file=./my.ini";
        server_groups[0] = "client";
        server_groups[1] = "server";
        server_groups[2] = "'0";
        if (mysql_server_init(2, server_options, server_groups) != 0)
        {
            int lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("MySQL Library Init Failed with error code: " + lastError);
            return false;
        }
        Console.WriteLine("MySQL Library Started Successfully!");
        return true;
    }

在c# pt中调试DLLImport

mysql_server_init函数不通过Win32错误报告机制SetLastError()GetLastError()报告错误。因此,您不能使用Marshal.GetLastWin32Error()来获得最后的错误。嵌入式mysql数据库通过mysql_error()mysql_errno()函数报告错误。然而,这些函数似乎只在成功调用mysql_server_init()后才报告错误

我认为你的代码问题在于你终止你的server_groups数组的方式。你应该使用"null"而不是"'0"来"终止"你的数组:

public static bool Start() 
{ 
    server_options[0] = "mysql_test"; // not used? 
    server_options[1] = "--defaults-file=./my.ini"; 
    server_groups[0] = "client"; 
    server_groups[1] = "server"; 
    server_groups[2] = null; 
    if (mysql_server_init(2, server_options, server_groups) != 0) 
    { 
        int lastError = Marshal.GetLastWin32Error(); 
        Console.WriteLine("MySQL Library Init Failed with error code: " + lastError); 
        return false; 
    } 
}

关于配置的错误应该通过mysql_server_init()函数打印到控制台窗口。

希望有帮助。