【问题标题】:Debugging DLLImport in C# pt. 2在 C# 中调试 DLLImport pt。 2
【发布时间】:2011-10-19 22:28:42
【问题描述】:

我正在使用 MySQL 嵌入式库并使用 P/Invoke 调用必要的函数来启动服务器。我们在this 主题中解决了一些与它相关的问题,但是另一个问题已经出现了。

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# mysql interop pinvoke embedded-database


【解决方案1】:

mysql_server_init 函数不会通过 Win32 错误报告机制 SetLastError()GetLastError() 报告错误。所以,你不能使用Marshal.GetLastWin32Error()来获取最后一个错误。嵌入式mysql数据库通过函数mysql_error()mysql_errno()报告错误。但是,这些函数似乎只报告错误AFTER成功调用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() 函数应将有关您的配置的错误打印到控制台窗口。

希望,这会有所帮助。

【讨论】:

  • 很抱歉回复晚了,在我提出赏金后就住院了。无论如何,我只是尝试使用 null ,但它仍然失败。不幸的是,我在控制台窗口中得到的只是我的 WriteLine 打印输出,表明它失败了。还有其他想法吗?
  • @BrettPowell:你使用哪个版本的mysql?你能发布你的 my.ini 文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多