2

他社の製品とインターフェイスするマネージC++アプリケーションを開発しています。彼らの製品は.netベースであり、使用するメインAPIはfoo.dllと呼ばれる.netアセンブリから取得されます。

私のアプリケーションでは、最初に製品をインストールする必要があります。製品をインストールすると、3つの異なるアプリケーションが生成されます。それぞれが独自のディレクトリにあり、それぞれが独自の/ binディレクトリを持ち、それぞれが同じ.dllファイルのローカルコピーを持っているため、次のことがわかります。

C:\company\product1\bin\foo.dll  
C:\company\product2\bin\foo.dll  
C:\company\product3\bin\foo.dll  

同社は、使用する.dllと、製品をインストールするときにGACに入れていない.dllを教えてくれました。現在、ビルド後に.dllをbinディレクトリにコピーすることで、アプリケーションを実行できます。しかし、自分の製品のインストーラーを作成しようとしているので、これに対処するためのエレガントな方法を見つけるのに苦労しています。APIが変更されていないと仮定すると、私が持っている.dllがそのマシンで使用しているものと一致する限り、ほとんどのバージョンの製品に対して実行できるはずです。

明らかに、理想的な解決策は、製品をインストールするときにこれらのアセンブリをGACに配置することです。特に、それらを共有しているためですが、製品はまだ未成熟であり、より重要な点が多いため、これは起こりそうにありません。問題、そして彼らがしていることは彼らのために働きます。

そのため、製品をインストールするときに必要な.dllを見つけて使用する方法の問題が残ります。私がこれまでに思いついたオプションは次のとおりです。

  1. インストーラーに.dllを含めます

    • 悪いことに、これは私を彼らのソフトウェアの特定のビルドに固定し、とにかく彼らからインクリメンタルな開発ビルドを取得しているため、彼らの公開リリースとは一致しません。
  2. インストーラーにインストールディレクトリを見つけてもらい、gacutil.exeなど、.dllをGACに配置するために必要なものをすべて実行します。

    • 悪いことに、gacutil.exeは開発専用であると想定されており、インストーラーに含めて、独自の製品と一緒にインストールする必要があることを意味します。また、製品がアセンブリを見つけるのを妨げる可能性もあります。
  3. インストーラーにインストールディレクトリを見つけてもらい、必要な.dllを自分のディレクトリにコピーします。

    • シンプルで動作しますが、エレガントではありません。つまり、新しい.dllがコピーされるまで、製品にマイナーな更新が加えられた場合でも、アプリケーションが破損する可能性があります。また、ファイルをコピーする必要がないようにしたいと思います。
  4. http://www.roelvanlisdonk.nl/?p=713で見つけたコードを使用して、実行時にアプリケーションの.net検索パスにインストールディレクトリをプログラムで追加します。

    • Reasonabyは、機能する場合は単純ですが、維持するコードが多くなります。これまでのところ、ディレクトリからdllを自動的にロードする唯一のルートのようです。

マネージC++と.netはまだ私にとって比較的新しいものであり、私のコーディングのほとんどはLinuxベースのC++です。私が感じているのは、他の人が自分たちに対して開発できるようにしたい場合、他の会社が.netアセンブリの使用方法を正しく管理していないため、非常に困難になるだろうということです。

より多くの経験を持つ誰かがこのようなことに対処し、それを回避する方法を見つけなければなりませんでしたか?

4

1 に答える 1

1

たぶん、問題の.dllへのシンボリックリンクを作成することでこれを解決できますか?このようにして、アプリはファイルを表示して使用できるようになり、ディスク上の物理ファイルを使用します。それらがファイルを更新する(いくつかのバグを修正する)が、それでも下位互換性がある場合は、新しいcode/.dllを自動的に使用できるようになります。

ここでの主な問題は、問題のアセンブリが他のapから使用されることを意図しているかどうかです。彼らのAPIは安定していますか?そうでなければ、基本的にあなたができることは何もありません。

さらに、それらのディレクトリをアセンブリ検索の読み込みパスに追加すると、将来X.dllという名前のアセンブリが複数存在する可能性があるため、意図せずに間違ったアセンブリを読み込むことができます。

于 2013-03-12T23:24:06.760 に答える