40

「Any CPU」としてWindowsサービスを構築しました。ただし、64 ビット マシンで実行すると、32 ビットで実行されます。どうすれば修正できますか?.NET と C# を使用しており、オペレーティング システムは Windows 2008 R2 です。

x64 でビルドすると、64 ビット モードで正しくロードされます。ただし、「Any Cpu」-これは私が望んでいるものです-実行しているマシンが64ビットを完全にサポートしているにもかかわらず、32ビットでロードされます。

編集して、フィードバックに基づいてさらに情報を追加します

サード パーティのツールがあり、C++ マネージ アセンブリを参照しています。これらは、任意の CPU 用に構築されている場合と構築されていない場合があります。実際、c++ マネージ アセンブリは x86 用にのみビルドされていることを知っています。ただし、奇妙なことに、x64 を具体的に指定すると、プロセスが起動して x64 で動作します。フレームワークが C++ マネージ アセンブリを読み込もうとすると、失敗します。コードでは、64 ビット モードで実行している場合、32 ビット マネージ ++ アセンブリをロードしないため、これは気にしません。ここに 32 ビット アセンブリがあるため、起動プロセス (この場合は Windows サービス アセンブリ) を x86 としてマークする必要があるとビルドが判断している可能性がありますか?

4

4 に答える 4

15

x64 OS で AnyCPU アセンブリを強制的に 32 ビットとして実行できる設定があります。
.Net2 x64 ディレクトリから ldr64.exe を使用して、ステータスを確認します。

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>ldr64.exe クエリ
kernel32 を読み込んでいます...完了。
GetComPlusPackageInstallStatus エントリ ポイントを取得しました
SetComPlusPackageInstallStatus エントリ ポイントを取得しました
現在のステータス: 0x00000001

1 - 「AnyCPU を 64 ビットとして実行する」
ことを意味します 0 - 「AnyCPU を 32 ビットとして実行する」ことを意味します

.Net v4 フォルダーにそのようなユーティリティは見つかりませんでしたが、この設定は Net4 AnyCPU アセンブリにも適用されます。このフラグは、キーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ .NETFramework の下のDWORD レジストリ値Enable64Bitに保存されます。

この設定は OS の起動時に読み込まれるようで、レジストリ値のみを変更しても、再起動するまでアプリケーションには影響しません。ldr64.exe でフラグを変更すると、すぐに有効になります。

この設定はシステム全体に適用されることに注意してください。デフォルトでは、Enable64Bit は 1 に設定されています。一部のアプリケーションがそれを 0 にリセットしたようで、値を元に戻すとそのアプリに問題が発生する可能性があります。

于 2013-02-13T15:43:57.610 に答える
2

この回答に感謝します。CorFlagsを使用して、64 ビットとして実行します。

corflags.exe WindowService.exe /32bitpref- /32bitreq-

私が使用した CorFlags のバージョンは 4.0.30319.17929 で、C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools. 次の方法で古いバージョンを試すことができます。

corflags.exe WindowService.exe /32bit-
于 2013-05-02T16:50:22.993 に答える