繁体   English   中英

Node.js 本机模块不是有效的 Win32 应用程序错误

[英]Node.js native module is not a valid Win32 application error

尝试为 node.js 制作 Hello World 原生模块

在 VS 2012 中使用一个文件获得了一个 Win32 项目:

#include <node.h>
#include <v8.h>

using namespace v8;

Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("world"));
}

void init(Handle<Object> target) {
  target->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)

这将编译为 hello.node。
选项:
- 动态库 (.dll)
- 没有公共语言运行时支持

像这样使用它:

hello = require './hello'
console.log hello.hello()

它适用于本地机器(win8 x64,节点:0.8.12)
但是在远程服务器(windows server 2008 x64,节点:0.8.12,iisnode:0.1.21 x64,iis7)上它会抛出这个错误:

应用程序抛出了一个未捕获的异常并被终止:错误:
%1 不是有效的 Win32 应用程序。

C:\\inetpub\\test\\lib\\server\\hello.node
在 Object.Module._extensions..node (module.js:485:11)
在 Module.load (module.js:356:32)
在 Function.Module._load (module.js:312:12)
在 Module.require (module.js:362:17)
在要求 (module.js:378:17)
在对象。 (C:\\inetpub\\test\\lib\\server\\index.js:32:9)
在 Module._compile (module.js:449:26)
在 Object.Module._extensions..js (module.js:467:10)
在 Module.load (module.js:356:32)
在 Function.Module._load (module.js:312:12)

我尝试了什么:
使用应用程序池设置(启用 win32 应用程序)没有帮助。
iisnode x86 不能安装在 x64 操作系统上。
由于错误无法编译为 x64:错误 2 错误 LNK1112:模块机器类型 'X86' 与目标机器类型 'x64' 冲突 C:\\derby\\hello\\build\\node.lib(node.exe) hello

有没有人有什么建议?

我不知道是不是太晚了,但经过反复试验,我找到了答案,主要问题(在我的机器上)是我在 windows 上编译了 nodejs 以便能够使用 Visual C++ 创建扩展,而我已经有了从页面安装了 nodejs,如果我尝试使用默认安装(由 nodejs 安装程序添加到我的 PATH 中)运行测试,那么它会失败,但是如果我使用编译的 node.exe(我编译为能够引用 Visual C++ 中的库)然后它就可以工作了。

总之,问题不在于扩展,而在于 nodejs 编译,使用您编译的节点(为了构建 VS 解决方案,我假设您这样做了),然后它应该可以在远程机器上运行。

注意:问题在于您使用的是 64 位编译的 node.exe 来运行 32 位 dll,这就是它抱怨的原因,如果您使用 32 位的 node.exe 它应该可以工作。 (至少解决了我的问题)

只是遇到了同样的问题,即使我的节点和插件的架构相同,我也收到了类似的错误消息。 事实证明,您无法重命名节点可执行文件。 它必须是node.exe ,我试图同时测试多个版本,所以我不得不将它们放在自己的文件夹中。 之后,一切正常。

就我而言,问题是尝试在使用 Linux 构建(适用于 Windows)的 Windows 上执行 Electron 应用程序。 我通过使用 Windows 构建它(对于 Windows)来解决。

为了在 Windows 上构建它,我使用了以下命令:

npm install --global-production windows-build-tools
npm install
npm run build:prod && electron-builder build --windows

要执行最后一个命令,您需要electron-builder ,如果没有,请安装它

npm install --save-dev electron-builder

使用 Electron Forge webpack typescript 样板。 这对我有用:

webpack.main.config.js添加externals: ['sqlite3']

module.exports = {
  /**
   * This is the main entry point for your application, it's the first file
   * that runs in the main process.
   */
  entry: './src/electron-entrypoint.ts',
  // Put your normal webpack config below here
  module: {
    rules: require('./webpack.rules'),
  },
  resolve: {
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json']
  },
  externals: ['sqlite3']
};

来源

或者 - 这也对我有用-,您可以使用better-sqlite3 ,如建议here

与您的问题无关:尝试执行扩展名为“.node”的脚本(例如node.exe example.node )时,我遇到相同的错误( Error: %1 is not a valid Win32 application )。 其他扩展名(.js、.txt,根本没有扩展名)工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM