5

Visual Studio 2010 を使用して 64 ビット システムでサービスを開発しました。このサービスは、セカンダリ ライブラリの Start メソッドと Stop メソッドにアクセスする単なるスケルトンです。ライブラリは 64 ビット COM オブジェクトにアクセスし、x64 としてビルドする必要があります。COM オブジェクトは、x64 として個別にビルドされ、64 ビット環境でテストされた dll です。プロジェクトをセットアップし、カスタム アクションを介してサービスをインストールするインストーラーがあります。

サービスをバイパスするテスト アプリでコードをデバッグすると、サービスがアクセスしているライブラリが正しく機能していることを確認できます。

私が抱えている問題は、インストール時の BadImageFormatException です。x64 のターゲット プラットフォームでインストーラーを使用しています。すべてを x64 としてビルドすると、次のメッセージが表示されます。

Error 1001. Exception occured while initializing the installation: System.BadImageFormatException. Could not load file or assembly... or one of its dependencies. An attempt was made to load a program with an incorrect format.

サービスを任意の CPU としてビルドするように設定すると、インストールは機能し、サービスはライブラリにアクセスできますが、COM オブジェクトが見つかりません。サービスをインストールするカスタム アクションを削除しても、インストールは機能します。その後、installutil を使用してサービスを手動でインストールしようとすると、上記と同じエラー メッセージが表示されます。

以下は、私がサービスで使用しているライブラリのリストです。

using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using MAPIMail;
using MAPIMail.Logging;

MAPIMail プロジェクトは x64 としてビルドされていることに注意してください。

x64システムに任意のCPUとして問題なくインストールできるのに、なぜサービスをx64としてインストールできないのか、誰もが知っていますか? すべての提案に感謝します。

4

2 に答える 2

6

Alex と Jacob Seleznev の両方のソリューションを試しましたが、どちらも機能しました。JacobのリンクからのGreg Sansomによる2番目の回答が最良の解決策を提供することがわかりました。他の人を助けるために、私は彼の答えを以下にコピーしました:

これは、インストーラーが 64 ビット dll をインストールしている場合に発生する可能性があります。以下は MSDN からのコピーです。

64 ビット マネージ カスタム アクションをセットアップ プロジェクトに追加すると、Visual Studio のビルド プロセスによって、InstallUtilLib.dll の 32 ビット バージョンが InstallUtil として MSI に埋め込まれます。次に、32 ビットの .NET Framework が読み込まれて 64 ビットのマネージ カスタム アクションが実行され、BadImageFormatException 例外が発生します。

回避策として、32 ビットの InstallUtilLib.dll を 64 ビット バージョンに置き換えます。

1. Open the resulting .msi in Orca from the Windows Installer SDK.
2. Select the Binary table.
3. Double click the cell [Binary Data] for the record InstallUtil.
4. Make sure "Read binary from filename" is selected and click the Browse button.
5. Browse to %WINDIR%\Microsoft.NET\Framework64\v2.0.50727.
6. The Framework64 directory is only installed on 64-bit platforms and corresponds to the 64-bit processor type.
7. Select InstallUtilLib.dll.
8. Click the Open button.
9. Click the OK button.

share|edit|flag は 2011 年 7 月 23 日 3:09 に回答されました

于 2013-03-13T17:22:13.807 に答える
4

私の推測では、32ビットとしてのみインストールできる32ビットのInstallUtilを使用していると思います。ここで説明するように、64ビットのInstallutilを使用する必要があります。

于 2013-03-06T21:23:45.330 に答える