我正在尝试使用kernal32.dll中的几个函数。但是,当我的应用程序试图调用第一个函数时,它会抛出一个EntryPointNotFoundException Unable to find an entry point named 'SetDllDirectory' in DLL 'kernel32.dll'.
public class MyClass
{
/// <summary>
/// Use to interface to kernel32.dll for dynamic loading of similar DLLs.
/// </summary>
internal static class UnsafeNativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
internal static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
internal static extern bool SetDllDirectory(string lpPathName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
}
private void MyFunc()
{
if (UnsafeNativeMethods.SetDllDirectory(_location) == false) // <-- Exception thrown here.
{
throw new FileNotFoundException(_location);
}
/* Some code. */
_dllHandle = UnsafeNativeMethods.LoadLibrary(_fullPath);
/* Some more code. */
_fptr = UnsafeNativeMethods.GetProcAddress(_dllHandle, _procName);
/* Yet even more code. */
}
}任何关于我做错了什么以及如何让它工作的想法都将不胜感激。谢谢。
发布于 2010-09-21 00:12:42
您必须删除ExactSpelling属性。该函数的真实名称是SetDllDirectoryW。我也推荐你使用CharSet.Auto,使用Ansi是一个有损的转换,可能会导致一些微妙的问题。在XP SP1之前的任何Windows版本中都不提供导出。
发布于 2010-09-21 00:16:55
我不太了解DllImport,但是在我的机器上删除ExactSpelling属性就可以了。
https://stackoverflow.com/questions/3753306
复制相似问题