winform程序, 调用dll方式如下,dll路径为指定了绝对路径
1 [DllImport("kernel32.dll")] 2 private extern static IntPtr LoadLibrary(String path); 3 [DllImport("kernel32.dll")] 4 private extern static IntPtr GetProcAddress(IntPtr lib, String funcName); 5 [DllImport("kernel32.dll")] 6 private extern static bool FreeLibrary(IntPtr lib);
winform运行可以成功加载dll,并成功执行。
现在把winform注册成了windows服务,并指定用户为超级管理员administrator,调试的时候发现,IntPtr hLib = LoadLibrary("E:\\abc.dll");
hLib 一直为0,getlasterror未发现错误,求解。
[DllImport("kernel32.dll",SetLastError=true)]
找到错误提示了:%1 不是有效的 Win32 应用程序。
编辑的wf为x86,引用的dll也是32位的,解决方案里的其他工程都是any cpu,手动运行winform是32位的,可以正确加载外部dll。用服务启动的话,进程默认为64位,引用dll就报错了。
现在尝试把解决方案里的工程全部改为x86输出的话,服务就没办法启动了,提示:试图加载格式不正确的程序...。
无语
@Frida-: 用 32 位版本的 InstallUtil 安装服务。
出现这种情况只有两种可能:
1. 权限问题,查看下服务是否跑在合适的上下文。
2. 依赖的dll是静态的,如果是静态的那本身就是无法加载的,只能修改成动态链接