我正在使用MySQL嵌入式库,并使用P/Invoke调用启动服务器所需的函数。我们在this主题中解决了一些与此相关的问题,但也出现了另一个问题。
函数的作用是:如果成功,返回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;
    }

最佳答案

mysql_server_init函数不会通过Win32错误报告机制SetLastError()GetLastError()报告错误。因此,您不能使用Marshal.GetLastWin32Error()来获得最后一个错误。嵌入式mysql数据库通过mysql_error()mysql_errno()函数报告错误。但是,这些函数似乎只在成功调用mysql_server_init()后报告错误。
我认为代码的问题在于终止服务器组数组的方式。
应该使用“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()函数打印到控制台窗口。
希望,这有帮助。

关于c# - 在C#pt中调试DLLImport。 2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7828992/

10-13 04:38