none
VistaとXPでDLLの参照先を変更する RRS feed

  • 質問

  •  

    C#2005でVistaとXPでOSを判断してDLLを参照先を変更する方法を検討しています。

     

    一部の機能について、XPとVistaの両方に対応するのが難しく、XP対応のDLLとVista対応のDLL

    に分かれてしまいます。

    参照する側でOSを判断して切り替えることは可能でしょうか。

     

    現在、考えている方法としては

    (1) アプリケーション名.exe.config を XP と Vista で別にする。

    (2) machine.config を XP と Vista で別にする。

    を検討していますが、プログラムで変更できる方法があれば、2重に管理する必要がないので

    よいのですが。

     

    2008年5月12日 9:37

回答

  •  nasv さんからの引用

    そのとおりだと思いますが。

    実際はDLLは外部で作成しているため簡単に変更できません。

    質問のような対応をする方法はないでしょうか?

     

    参照先の変更というか、動作時に OS のバージョンを見て Assembly.Load するアセンブリ (DLL) を切り替えるコードを書くことになるのではないでしょうか。 インストーラで振り分けることによって対応する方法もありといえばありですね。

     

    参照先の変更はビルドの段階で解決されていると思いますので手を加えようがないような。

    むしろ動的にするなら参照ではなく、動的 Load になるような。

    2008年5月12日 13:18
  • XPとVistaのサポートを考えているということは、顧客の一般的なPCで実行されると予想しますが、最初に提示された方法はどちらも危なっかしいような気がします。

     

     nasv さんからの引用

    (1) アプリケーション名.exe.config を XP と Vista で別にする。

    インストール時点でXPだったとしても、いずれVistaにアップグレードする可能性があります。

    そのときはXPの構成ファイルのアプリケーションがVista上で動くことになります。

     

     nasv さんからの引用

    (2) machine.config を XP と Vista で別にする。

    machine.configはコンピュータ全体に適用されるファイルです。

    パッケージや組み込み、自社内PCでもない限りは避けた方が無難かもしれません。

    http://msdn.microsoft.com/ja-jp/library/ms229697(VS.80).aspx

     

     

    手としてはじゃんぬねっとさんが提示されているアセンブリを動的に読み込む方法かなと考えます。

    もちろん、動的に読み込むので依存関係が切れますし、型もコンパイル時点でチェックされなくなります。

     

     

    余談

    アセンブリが異なる時点で、厳密には同じ型ではないはず。

    見た目が似ていれば差し替えても動くとは思いますが、内部まで厳密に一致するわけではないと考えられるので、何が起こるか分からない。テストを考えると恐ろしいなぁ…。

    2008年5月12日 14:49
    モデレータ

すべての返信

  • 「対象のOSによって使用するDLLを変更する」という実装は一般的ではありません。

    そのDLL内でOSを判断し、必要な機能がサポートをそれぞれ実装したほうが良いと思います。

     

    DLLを利用する側はその機能がサポートされているかどうかを判断して、その処理を実行するかどうかを判断すれば良いのではないでしょうか?

     

    2008年5月12日 9:43
  • そのとおりだと思いますが。

    実際はDLLは外部で作成しているため簡単に変更できません。

    質問のような対応をする方法はないでしょうか?

    2008年5月12日 12:48
  •  nasv さんからの引用

    そのとおりだと思いますが。

    実際はDLLは外部で作成しているため簡単に変更できません。

    質問のような対応をする方法はないでしょうか?

     

    参照先の変更というか、動作時に OS のバージョンを見て Assembly.Load するアセンブリ (DLL) を切り替えるコードを書くことになるのではないでしょうか。 インストーラで振り分けることによって対応する方法もありといえばありですね。

     

    参照先の変更はビルドの段階で解決されていると思いますので手を加えようがないような。

    むしろ動的にするなら参照ではなく、動的 Load になるような。

    2008年5月12日 13:18
  • XPとVistaのサポートを考えているということは、顧客の一般的なPCで実行されると予想しますが、最初に提示された方法はどちらも危なっかしいような気がします。

     

     nasv さんからの引用

    (1) アプリケーション名.exe.config を XP と Vista で別にする。

    インストール時点でXPだったとしても、いずれVistaにアップグレードする可能性があります。

    そのときはXPの構成ファイルのアプリケーションがVista上で動くことになります。

     

     nasv さんからの引用

    (2) machine.config を XP と Vista で別にする。

    machine.configはコンピュータ全体に適用されるファイルです。

    パッケージや組み込み、自社内PCでもない限りは避けた方が無難かもしれません。

    http://msdn.microsoft.com/ja-jp/library/ms229697(VS.80).aspx

     

     

    手としてはじゃんぬねっとさんが提示されているアセンブリを動的に読み込む方法かなと考えます。

    もちろん、動的に読み込むので依存関係が切れますし、型もコンパイル時点でチェックされなくなります。

     

     

    余談

    アセンブリが異なる時点で、厳密には同じ型ではないはず。

    見た目が似ていれば差し替えても動くとは思いますが、内部まで厳密に一致するわけではないと考えられるので、何が起こるか分からない。テストを考えると恐ろしいなぁ…。

    2008年5月12日 14:49
    モデレータ