在 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#)包装器进入本机(C++)代码?
在同一解决方案中从 c# 项目到 c++ 项目的 DllImport