Мне кажется, что у вас есть маленькая ошибка, заставляющая mysql_server_init
читать за пределами массива.Замените 3
на 2
и удалите третью запись массива.Маршалер по умолчанию сделает все остальное.
public static bool Start()
{
string[] argv = new string[3];
argv[0] = "mysql_test";
argv[1] = "--datadir=C:/MYSQLTEST";
string[] groups = new string[3];
groups[0] = "libmysqd_server";
groups[1] = "libmysqd_client";
int res;
if ((res = mysql_server_init(2, argv, groups)) == 1)
{
Console.WriteLine("MySQL Library Init Failed with error code: %d", res);
return false;
}
}
Обновление
С этот поток , вы не должны использовать mysql_server_init
вообще, но вместо этого mysql_library_init
:
- И argv, и groups хранятся в библиотеке и используются позже.Это серьезная проблема, потому что если вы используете маршалинг P / Invoke, указатели, которые .NET передает функции, станут недействительными, как только функция вернется.Когда библиотека позже попытается обратиться к argv или группам, она не найдет ничего, кроме мусора, что приведет к непредвиденному поведению или аварийному завершению.вместо этого используется mysql_library_init - он создает внутреннюю копию argv и групп, поэтому вы можете без проблем использовать маршалинг P / Invoke (до тех пор, пока вы добавляете нулевую запись в конец групп).В противном случае вам придется самостоятельно выделить память для массивов и каждой строки, чтобы убедиться, что указатели остаются в силе до тех пор, пока ваша программа работает.
Итак, если вы можете перейти на использование mysql_library_init
, я бы предложил сделать это.Маршалинг вручную не является тривиальным делом (но не слишком сложным).