2

次の (単純化された) ファイル レイアウトを持つ Windows、C++ ソフトウェア プロジェクト (Visual Studio 2005、SP1 でビルド) があります。

{App. Root Directory}
|-- bin
|   |-- Microsoft.VC80.CRT
|   +-- Microsoft.VC80.MFC
+-- utils

binディレクトリとutilsディレクトリの両方に存在するさまざまな実行可能ファイルがあります。これらの実行可能ファイルはそれぞれ、binに格納されているサイド バイ サイド アセンブリ (C++ ランタイム DLL) に依存していますが、さまざまな理由からこれらの個別のフォルダーに分離しています (たとえば、utilsフォルダー内の exe は補助ツールです)。頻繁に実行されることはありません)。このファイル構成の直接的な結果として、utilsフォルダー内のアプリは、適切な side-by-side アセンブリがインストールされていないシステムでは実行できません (通常、「システムは指定されたプログラムを実行できません」というメッセージで失敗します)。エラーメッセージ)。

私の質問: utilsフォルダー内のアプリに、..\binフォルダー内で適切なサイド バイ サイド アセンブリを明示的に検索するように指示する方法はありますか? MicrosoftのAssembly Searching Sequenceの記事では、これが可能かどうかについては言及されていません。これらのアプリケーションのこのランタイム要件を解決できる賢い方法はありますか?

私が見る潜在的なオプション:

  1. side-by-side アセンブリのコピーをutilsフォルダーに配置します。これは実行時に行うこともできますが (アプリケーションのインストール パッケージが肥大化するのを防ぐため)、少し面倒です。
  2. ランタイム DLL を静的にリンクします。やりたくない!
  3. エンド ユーザーに、通常の再配布可能パッケージをインストールしてもらいます。これもやらないほうがいいです。
4

1 に答える 1

4

私の最初の回答は、.\binフォルダからユーティリティを分離することによって得られる実際の利点は何ですか? 私自身 OCD の傾向があるので、きちんとしているという感覚は理解できますが、アプリケーションを展開する能力に悪影響を与えることが明らかになっていると、練習を続けるのは少し無意味に思えます。

とは言っても、実際には技術的に可能です。これを行うには、app.config ファイルのプローブ privatePath要素を使用します。アプリケーション構成ファイルは、リソースとして埋め込むことができないことを除いて、アプリケーション マニフェストと同様に機能します。exe と同じフォルダーに、exe のフル ネーム (exe 拡張子を含む) を付けて を追加したファイルを作成します.config

<!-- acme.exe.config -->
<configuration>   
  <windows>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;..\bin" />
    </assemblyBinding>
  </windows>
</configuration>

このソリューションが機能しない可能性があるいくつかの注意事項があります。独自の依存アセンブリを指定するすべての dll には、probing privatePath要素を含むアプリケーション構成ファイルが必要です。また、ノードのサポートprobingは Windows NT 6.0 (Vista) でのみ追加されたため、XP をターゲットにする必要がある場合、このソリューションは不適切です。

于 2012-04-30T20:42:33.443 に答える