在 C# 中调试 DLLImport pt。 2

Posted

技术标签:

【中文标题】在 C# 中调试 DLLImport pt。 2【英文标题】:Debugging DLLImport in C# 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;
    

【问题讨论】:

mysql_server_init 是否调用 SetLastError()?我在文档中没有看到任何迹象:dev.mysql.com/doc/refman/5.6/en/mysql-server-init.html 【参考方案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 文件吗?

以上是关于在 C# 中调试 DLLImport pt。 2的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 [DllImport("")]?

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

在同一解决方案中从 c# 项目到 c++ 项目的 DllImport

在 C# DllImport 中使用 32 位或 64 位 dll

C# 中dllimport 调用不同文件夹终极方法

C# 中dllimport 调用不同文件夹终极方法