我有一些旧的代码似乎无法在64位Windows 7上运行。没有试过32位Windows 7,但绝对适用于32位XP。
该代码最初源自本文http://www.codeproject.com/KB/cs/DynamicInvokeCSharp.aspx
我已阅读this question,其中指出kernel32.dll仍然存在。
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
private static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
private static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);
[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
private static extern bool FreeLibrary(int hModule);
[DllImport("kernel32.dll")]
private static extern bool SetDllDirectory([M
arshalAs(UnmanagedType.LPStr)] string lpPathName);
这就是它的用法:
public void Init(string dllName)
{
DllName = dllName;
SetDllDirectory(Path.GetDirectoryName(dllName));
hModule = LoadLibrary(Path.GetFileName(dllName));
if (hModule == 0)
throw new Exception("Cannot load dll " + dllName);
}
我得到的问题是LoadLibrary
始终为句柄返回0
。
我也试过hModule = LoadLibrary(dllName);
任何人都可以说明为什么它可能不起作用,或者我应该做什么呢?
答案 0 :(得分:1)
(根据答案评论)
大多数Windows API函数调用名为SetLastError()
的例程来指示失败原因。在.NET中使用DllImport
时,可以向属性添加属性以明确指示函数应该保留最后一个错误(我对默认行为不是100%肯定,但是明确保证它会发生)。
例如:
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
private static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
然后,您可以通过调用Marshal.GetLastWin32Error()
从托管代码中获取错误代码,或者通过抛出Win32Exception
throw new Win32Exception(Marshal.GetLastWin32Error())
来获得更有用的异常{{1}}