Отладка DLLImport в C # pt.2 - PullRequest
1 голос
/ 20 октября 2011

Я использую встроенную библиотеку 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;
    }

1 Ответ

4 голосов
/ 23 октября 2011

Функция mysql_server_init не сообщает об ошибках с помощью механизма сообщений об ошибках Win32 SetLastError() и GetLastError(). Таким образом, вы не можете использовать Marshal.GetLastWin32Error() для получения последней ошибки. Встроенная база данных mysql сообщает об ошибках через функции mysql_error() и mysql_errno(). Однако эти функции, кажется, только сообщают об ошибках ПОСЛЕ a успешный звонок на 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().

Надеюсь, это поможет.

...