在过去的12个小时里,我一直试图让我的申请表中的MySQL Embedded Library工作,并且已经被卡住了相当长的一段时间。当我调用mysql_server_init()时出现以下错误。。。
未处理的异常:System.AcessViolationException:尝试读取
或写保护内存。
C++方法采用一个int和两个char**作为参数,但是我被告知一个空结束的string[]数组在C语言中就足够了。因为这是您应该调用的第一个方法,所以对于这个问题,我有些不知所措。
这是我的密码。。。

public class MySQLServer
{
    [DllImport("libmysqld.dll")]
    static extern int mysql_server_init(int argc, string[] argv, string[] groups);

    [DllImport("libmysqld.dll")]
    static extern void mysql_server_end();

    public static bool Start()
    {
        string[] argv = new string[3];
        argv[0] = "mysql_test";
        argv[1] = "--datadir=C:/MYSQLTEST";
        argv[2] = null;

        string[] groups = new string[3];
        groups[0] = "libmysqd_server";
        groups[1] = "libmysqd_client";
        groups[2] = null;

        int res;

        if ((res = mysql_server_init(3, argv, groups)) == 1)
        {
            Console.WriteLine("MySQL Library Init Failed with error code: %d", res);
            return false;
        }

        Console.WriteLine("MySQL Library Started Successfully!");
        return true;
    }
}

最佳答案

在我看来,您有一个小错误,导致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;
    }
}

更新
this thread开始,您根本不应该使用mysql_server_init,而应该使用mysql_library_init
“argv”和“groups”都由库存储并在以后使用。这是一个严重的问题,因为如果使用P/Invoke封送处理,则
.NET传递给函数的指针将在第一时间变为无效
当函数返回时。当库稍后尝试引用argv时
或者小组,在那里只会发现垃圾,导致意外
行为或撞车。
如果您使用的是MySQL 5.0.3或更高版本,请尝试使用MySQL库初始化
相反,它会生成argv和组的内部副本,因此您可以
继续使用P/Invoke封送处理没有问题(只要添加
组末尾的条目为空)。否则,你将不得不分配
数组和每个字符串的内存,以确保
只要程序运行,指针就保持有效。
因此,如果您可以切换到使用mysql_library_init,我建议您这样做。手工编组不是一件小事(但也不太难)。

关于c# - 在C#中调试DLLImport,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7822686/

10-17 00:13