如何修复“无效访问内存位置”错误?

时间:2011-03-02 16:05:14

标签: c# .net winapi pinvoke native

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr LoadLibrary(string lpFileName);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);

    static void Main(string[] args)
    {
        IntPtr handle = LoadLibrary(@"ItwNidSmart.dll");
        if (handle == IntPtr.Zero)
        {
            try
            {
                int hr = Marshal.GetHRForLastWin32Error();
                Marshal.ThrowExceptionForHR(hr);
            }
            catch (Exception ex)
            {
                Console.Write("Error: "+ ex.Message);
            }
        }
        IntPtr proc = GetProcAddress(handle, "InitializeModule");
    }

我尝试在Windows 7 x64中加载这个本机C ++库,但是我收到了这个错误。我已经为x86应用程序构建了这个解决方案。

调用LoadLibrary()时出错。

1 个答案:

答案 0 :(得分:1)

您实际上没有说明确切的错误消息,以及它出现在哪一行。您是否可能错误地链接到32位版本的ItwNidSmart.dll

事实上,你的P / Invokes是错误的,这可能是也可能不是你问题的原因。最重要的错误是GetProcAddress将过程名称指定为ANSI字符串。他们应该读:

[DllImport("kernel32", SetLastError=true)]
static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);

我不确定这些错误实际上是否会给您带来问题。


修改

您在评论中说明在调用LoadLibrary()时发生了失败。如果这引发异常,那么我能提出的唯一解释是错误位于DLL的DLLMain()而不是C#代码中。如果DLL的位数错误或未找到,则LoadLibrary()将返回NULL

我认为要解决这个问题,你需要查看DLL而不是C#代码。