[英]Debugging DLLImport in C# pt. 2
我正在使用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;
}
mysql_server_init
函数不会通过Win32错误报告机制SetLastError()
和GetLastError()
报告错误。 所以,你不能使用Marshal.GetLastWin32Error()
来获取最后一个错误。嵌入式mysql数据库通过函数mysql_error()
和mysql_errno()
报告错误。但是,这些函数似乎只在成功调用mysql_server_init()
后报告错误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()
函数打印到控制台窗口。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.