none
64bitのインストーラーについて RRS feed

  • 質問

  • お世話になります。

    64bitのインストーラーを作成しています。

     

    インストール中にインストールパスをレジストリに書き込んでいるんですが、

    Registry.LocalMachine.CreateSubKeyメソッドで書き込んだところ

    HKEY_LOCAL_MACHINE\Software\WOW6432Node\TestAppに書きこまれてしまいました。

    HKEY_LOCAL_MACHINE\Software\TestAppに書き込むにはどうすればよいでしょうか?

    2011年7月7日 7:30

回答

  • こういったページを見つけましたが、現状どうなっているかは未確認です。
    http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク yty0918 2011年7月12日 2:00
    2011年7月7日 14:51
    モデレータ
  • 内容はAzulean さんに紹介していただいた URL の内容と同じなんですが、

    この方法で InstallUtilLib.dll を 64 ビット バージョンで置き換えてインストールしたとこと下記のエラーがでました。

    「 Error 1001. InstallUtilLib.dll: Unknown error.」


    同じ URL の記事のコメントを追っていくと、同じエラーが出た話が出てきます。
    正しい InstallUtilLib.dll を使いましょう、という話でしょうか。
    • 回答としてマーク yty0918 2011年7月12日 2:00
    2011年7月11日 17:16

すべての返信

  • インストーラーのプロセスは 64bit プロセスなのでしょうか?
    まるで 32bit プロセスが WOW64 の上で動いているように見えます。
    タスク マネージャーでインストーラー プロセスを見ると、プロセス名に "*32" とか付いていたりしませんか?
    2011年7月7日 7:51
  • totojoさん回答ありがとうございます。

    タスク マネージャーでインストーラー プロセスを見ると、プロセス名に "*32"が付いていました。

    VS2010のセットアッププロジェクトでプロジェクトのプロパティのTargetPlatformをx64にしているんですがこれだけではダメなんでしょうか?

    ちなみに

    インストーラーはWindows7 32bitの環境で作成し、Windows7 64bitの環境にインストールしています。

    2011年7月7日 8:36
  • こういったページを見つけましたが、現状どうなっているかは未確認です。
    http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク yty0918 2011年7月12日 2:00
    2011年7月7日 14:51
    モデレータ
  • 内容から、カスタムアクションでレジストリにデータを書き込んでいると判断しました。
    クラスライブラリを作成して、インストーラークラスを作成しているのだと思います。

    Windows Installerは、MSIデータベースを動かす際のmsiexec.exeは、MSIデータベース内の
    Platformを見て適切なバージョン(32bitのmsiexec.exe or 64bitのmsiexec.exe)で動きますが、
    カスタムアクション用DLLを動かすmsiexec.exeは、DLLが32bitなのか64bitなのかによって適切な方が動きます。

    そのため、MSIの方をx64にしても、カスタムアクション用のDLLが32bitであれば、
    カスタムアクション用のmsiexec.exeは32bitの方が動いてしまい、64bitレジストリにアクセスできません。

    VS2010で作成するクラスライブラリですが、デフォルトでは、Any CPUになっていると思いますので
    これを x64 に変えてカスタムアクション用のDLLを64bitにしてください。


    これでいけるとよいのですが。

    2011年7月8日 5:47
  • artglassさん回答ありがとうございます。

     

    >内容から、カスタムアクションでレジストリにデータを書き込んでいると判断しました。
    >クラスライブラリを作成して、インストーラークラスを作成しているのだと思います。

    まったくそのとおりでございます。説明不足で申し訳ありません。

     

    >VS2010で作成するクラスライブラリですが、デフォルトでは、Any CPUになっていると思いますので
    >これを x64 に変えてカスタムアクション用のDLLを64bitにしてください。

    試してみましたが、インストール中に以下のエラーメッセージが出ました。

    「Error:1001.インストールを初期化中に例外が発生しました
    BadImageFormatException:ファイルまたはアセンブリ 'file::///c:\Program Files\XXX\ProgramFilesInstaller.dll'またはその依存関係の 1 つが読み込めませんでした。
    間違ったフォーマットのプログラムを読み込もうとしました。」

    何が問題なのでしょうか?

    2011年7月8日 8:24
  • BadImageFormatException だと Azulean さんがご紹介の URL が参考になると思います。
    Code Recipe の中に Visual Studio 2010 をターゲットとしたサンプルの中に InstallUtilLib.dll を使っているものがあるので、現在でも有効なのではないかと思われます。
    2011年7月8日 9:11
  • totojo さんが返信してくれました。ありがとうございます。


    せっかくですので、他のネタも書きます。(完全にご参考ネタです)


    カスタムアクション用のDLLですが、マネージコードに拘らなければ

    • DLLをネイティブコードで書き直してx64ビルドをする(一番お勧め)

    もしくは、

    • DLLをネイティブコードで書き直して、32bitビルドでRegOpenKeyEx()を使う際にKEY_WOW64_64KEYを付けてオープンして
      32bit DLLから64bitレジストリにアクセスする

    という方法もありますね。

    2011年7月8日 11:59
  • MSDNのサイトを調べていくと下記のようなサイトがありました。

    「セットアップ プロジェクトと配置プロジェクトのトラブルシューティング」

    http://msdn.microsoft.com/ja-jp/library/kz0ke5xt.aspx

    この中で「64 ビットのマネージ カスタム動作から System.BadImageFormatException 例外がスローされる」という項目がありました。

    内容はAzulean さんに紹介していただいた URL の内容と同じなんですが、

    この方法で InstallUtilLib.dll を 64 ビット バージョンで置き換えてインストールしたとこと下記のエラーがでました。

    「 Error 1001. InstallUtilLib.dll: Unknown error.」

    そして、イベントビューアを見ると下記のエラーが出ていました。

    「メッセージ リソースは存在しますが、メッセージが文字列テーブル/メッセージ テーブルに見つかりません。」

    なぜこのようなエラーが出たんでしょうか?

    2011年7月11日 5:19
  • この方法で InstallUtilLib.dll を 64 ビット バージョンで置き換えてインストールしたとこと下記のエラーがでました。

    「 Error 1001. InstallUtilLib.dll: Unknown error.」

    InstallUtilLib.DLL: Unknown Error
    http://connect.microsoft.com/VisualStudio/feedback/details/156062/installutillib-dll-unknown-error#details

    Error 1001 occurs when the user's code (the Installer class being called by InstallUtil) throws an unhandled exception. The exception details should be written to the MSI log.

    ということですが、log つきでインストールして、ログを確認されましたか?


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年7月11日 14:55
    モデレータ
  • 内容はAzulean さんに紹介していただいた URL の内容と同じなんですが、

    この方法で InstallUtilLib.dll を 64 ビット バージョンで置き換えてインストールしたとこと下記のエラーがでました。

    「 Error 1001. InstallUtilLib.dll: Unknown error.」


    同じ URL の記事のコメントを追っていくと、同じエラーが出た話が出てきます。
    正しい InstallUtilLib.dll を使いましょう、という話でしょうか。
    • 回答としてマーク yty0918 2011年7月12日 2:00
    2011年7月11日 17:16
  • 記事を再読して
    %WINDIR%\Microsoft.NET\Framework64\v2.0.50727のdllでなく
    %WINDIR%\Microsoft.NET\Framework64\v4.0.30319のdllを指定すると、
    エラーが出ずにWOW6432Nodeでないレジストリに書き込むことができました。
    ありがとうございました。
    2011年7月12日 1:59