none
C#加载C++导出的DLL问题 RRS feed

  • 问题

  • 代码如下: [DllImport("Kernel32")] public static extern int LoadLibrary(String funcname); [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")] public static extern bool FreeLibrary(int handle); public static Delegate GetFunctionAddress(int dllModule, string functionName, Type t) { int address = GetProcAddress(dllModule, functionName); if (address == 0) return null; else return (Delegate)Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t); } public delegate bool Start(); private void btnScua_Click(object sender, EventArgs e) { int hModule = 0; hModule = Program.LoadLibrary("scua.dll"); if (hModule == 0) { MessageBox.Show("找不到DLL!"); return; } Start dllFun = (Start)Program.GetFunctionAddress(hModule, "Start", typeof(Start)); if (dllFun == null) { MessageBox.Show("DLL出错!"); return; } try { dllFun(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return; } } 异常: --------------------------- --------------------------- System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at BoardLoad.Form1.Start.Invoke() at BoardLoad.Form1.btnScua_Click(Object sender, EventArgs e) in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\BoardLoad\Form1.cs:line 41
    2011年3月17日 2:32

答案

  • int handle 这个参数是句柄吧 用IntPtr类型 你的异常主要是因为c++对指针访问的时候发生的 给你看一段我的调用

    [DllImport("ReaderDll.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int ReadTag(
                    IntPtr hCom,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 8)]
                    byte[] pUID,//8字节UID
                    byte pBlockAddr, byte pBlockCount,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 512)]
                    byte[] pData);

    • 已标记为答案 A_Big_Mess 2011年3月17日 4:34
    2011年3月17日 3:01

全部回复

  • 为什么会这么乱的。。
    2011年3月17日 2:33
  • int handle 这个参数是句柄吧 用IntPtr类型 你的异常主要是因为c++对指针访问的时候发生的 给你看一段我的调用

    [DllImport("ReaderDll.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int ReadTag(
                    IntPtr hCom,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 8)]
                    byte[] pUID,//8字节UID
                    byte pBlockAddr, byte pBlockCount,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 512)]
                    byte[] pData);

    • 已标记为答案 A_Big_Mess 2011年3月17日 4:34
    2011年3月17日 3:01
  • int handle 这个参数是句柄吧 用IntPtr类型 你的异常主要是因为c++对指针访问的时候发生的 给你看一段我的调用

    [DllImport("ReaderDll.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int ReadTag(
                    IntPtr hCom,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 8)]
                    byte[] pUID,//8字节UID
                    byte pBlockAddr, byte pBlockCount,
                    [MarshalAs(UnmanagedType.LPArray, SizeConst = 512)]
                    byte[] pData);

    可以了,谢谢
    2011年3月17日 4:33