[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()
时出错。
答案 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#代码。