2011-08-05 16 views
0

AnyCPUを使用して構築されたADO.NETデータプロバイダを作成しました。直接参照されると、64ビットと32ビットの両方のWindows OSで正常に動作します。しかし、私のインストーラでは、DbProviderFactoryを.NETのmachine.configに登録し、アセンブリをGACに配置して、ユーザーがSystem.Windows.DbProviderFactoriesを通じてデータプロバイダにアクセスできるようにします。アプリケーションが32ビットとして動作している限り、これは素晴らしい動作をします。 x64用に構築されたアプリケーションでは機能しません。32ビットのインストーラ中に32ビットと64ビットの.NET machine.configを変更する64ビットプロセスを開始

これは私が見つけたものです。私のインストーラは32ビットを対象としています。したがって、私のDbProviderFactoryは、32ビットの.NET machine.configにのみ追加されます。 x64アプリケーションがDbProviderFactoriesを通じてデータプロバイダを使用するには、64ビット.NET machine.configに登録する必要があります。

2人のインストーラーが必要ですか? 1つは32をターゲットにし、もう1つは64をターゲットにするすべてのアセンブリはAnyCPUです(なぜなら、ユーザーのアプリケーションがどのプラットフォームであるかわからないからです)。

私のやや複雑な解決策はこれでした。インストーラ中に、OSが64ビット(here)かどうかを確認するカスタムアクションがあります。そうであれば、DbProviderFactoryをmachine.config(64ビット)に追加する64ビットのコンソールアプリケーションを実行するプロセスを開始したいと考えています。私のインストーラ自体は、32ビットmachine.configに登録されます。私は試してみましたが、32ビットをターゲットとするセットアッププロジェクトで64ビットアセンブリを使用できないため、失敗しました。しかし、64ビットOS上で64ビットプロセスとして動作すると仮定して、AnyCPUを使用してコンソールアプリケーションを構築しようとします。

これはむしろ乱雑ですが、私はと考えるととなります。なぜこれは悪い考えですか?そして、なぜマイクロソフトは「32ビットと64ビットの両方のプラットフォームに.NET Frameworkアプリケーションを配布し、32ビットと64ビットコンピュータ向けの2つのMSIパッケージを構築する」(msdn)と言います。技術的に私のアセンブリのすべてがAnyCPUなので、それは動作しますか?私は、32ビットおよび64ビットのインストーラを必要としない

1):

また、私は自分の質問に答えるために、.NET 3.5

+0

32ビットのmsiインストーラが32ビットプロセスとして起動するため、動作しないかどうかはわかりません。 AnyCPU dllは32ビット(32ビットプロセス内で実行されるAnyCPU dll)として実行されるはずです。したがって、64ビットと32ビットのMSIインストーラが必要です。 –

+0

32ビットのmsiインストーラで、AnyCPUコンソールアプリケーション(exe)を実行する_new_プロセスを開始したいが、これは64ビットOS上にある場合のみである。理論的には、この新しいプロセスは64ビット(64ビットのmachine.configにアクセスできる)として実行する必要があります。 – codyzu

+0

MSIは大きく依存しています。たぶん誰かがもう32ビットオペレーティングシステムをインストールしていない時代を迎えているのかもしれない。ちょうど2つのインストールを実行することは非常に低い痛みの解決策です。とにかくあなたに。 –

答えて

1

を使用しています。しかし、これはすべてのアセンブリがAnyCPUであるためです。

2)悪い考えではなく、1つのインストーラーをクライアントに配布するだけでよいため、64ビットマシンの追加のインストールアクションを魔法のように実行するので、良い考えです。

3)アセンブリや参照が明示的に32ビットまたは64ビット用に構築されている場合、M $は両方のインストーラを持つと言っていると思います。

最終的な解決策:私の32ビットインストーラでは、machine.configにアセンブリを登録します。次に、OSが64ビットであるかどうかを確認します。そうであれば、別のプロセスとしてAnyCPU用に構築されたコマンドラインユーティリティ(インストーラに含まれています)を起動します。このユーティリティは、64ビットのmachine.configにアセンブリを登録します。これは、AnyCPUユーティリティが64ビットOS上でのみ新しいプロセスとして起動されるため、64ビットプロセスがデフォルトとなるためです。完了しました。

関連する問題