9

依存関係に関連して他のプロジェクトに含まれるライブラリのリリースを作成するときのヒューリスティックとは何か、それらを含める必要があるかどうか疑問に思っています。

私の問題は次のとおりです。

名前が示すように、複数の場所で使用できる一連のユーティリティを提供する CommonUtilities ライブラリがあります。CommonUtilities の依存関係には、log4net.dll (ロギング フレームワーク) と Oracle.DataAccess.dll (データベース ドライバ) が含まれます。

CommonUtilities を含めたい MyProject という別のプロジェクトがあります。MyProject も Oracle.DataAccess に依存しています。

ILMerge を使用して CommonUtilities を単一のアセンブリ CommonUtilities.dll にマージし、それを MyProject から参照すると、すべてがコンパイルされますが、MyProject から Oracle.DataAccess を明示的に参照する必要があります。これは依存関係であり、CU にマージされたアセンブリを使用しないためです。Oracle.DataAccess への参照を追加すると、2 つの Oracle.DataAccess アセンブリが参照されるため、using ステートメントがあいまいになります。

私の場合、 ILMerge /Internalize を使用すると、内部化された Oracle.DataAccess アセンブリの型が CommonUtilities から返され、内部 MyProject としてマークされているため、返された型が認識されないため、コンパイル エラーが発生します。

これを機能させる唯一の方法は、この特定のアセンブリ (Oracle.DataAccess) を CommonUtilities にマージせず、MyProject からのみ参照することです。これにより、次のような新しい問題が発生します。どの Oracle.DataAccess.dll を参照する必要がありますか? CommonUtils で配布される依存関係ですか?

このすべてについて他の方法はありますか?

4

4 に答える 4

5

短く簡単なバージョン:

特定のアセンブリへの 1 つのプロセス内のすべての参照は、同じバージョンを参照する必要があります。

そうしないと、バージョンの不一致により、アプリの一部が別の部分と通信できなくなり、深刻な問題が発生する可能性があります。

log4net のような「本当にプライベートな」ものであっても、アプリのすべての部分に共通のルート ロガーを使用するなど、共有構成スペースの可能性を見逃す可能性があります。もちろん、この場合の最終的な電話は、いつものように、担当の開発者とのやり取りです。

ILMerge とサードパーティのアセンブリに関するこの他の質問も参照してください。

于 2008-11-03T20:53:06.060 に答える
4

ILMerge を使用する最大の理由は、難読化の手順を元に戻すのをより困難にするためです。/internalize フラグを使用してそれらをマージすることにより、難読化ツールは、親アセンブリにマージしたパブリック クラスとメソッドの名前を変更できます。

IL マージ ドキュメントから:「[Internalize] は、プライマリ アセンブリ以外のアセンブリ内の型の可視性が変更されているかどうかを制御します。それが true の場合、アセンブリの外部で表示されるすべての非免除型は、可視性が変更されるように変更されます。マージされたアセンブリの外からは見えません」

アセンブリが別々に保持されている場合、難読化ツールはそれらの名前を変更しません。

ところで、Eazfuscator は素晴らしく、無料です: http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx

于 2010-02-10T23:05:08.403 に答える
1

ライブラリはまったくマージしません。ライブラリをマージすることで得られない利点はあまりわかりませんが、そもそも1つのアセンブリでライブラリを構築するだけです。

ライブラリをEXEとマージすることの利点を見ることができます。それは本当に便利かもしれません。ライブラリをマージする際の問題は、EXEに異なるバージョンの依存関係がある可能性があり、不快な仲間を作る可能性があることです。

複数のファイルではなく単一のファイルを表示するためにそれらをEXEにマージする場合を除いて、dllをマージすることはベストプラクティスとは見なされないと思います。

于 2008-11-01T01:53:57.157 に答える
0

ローカライズされたアセンブリの束を1つに保持することに関して、いくつかの利点があると思います(これは、あなたができるかどうかさえわかりません)。

他のベンダーのライブラリをマージすることはしません。ライブラリには独自のライセンスがあることが多く、ライブラリを更新するには、コードの新しいバージョンを再配布する必要があるためです。

ディレクトリを整理するために多くのライブラリがある場合、または一部のコードが常にメインの実行アセンブリに含まれるようにする場合は、独自のライブラリをマージすると便利な場合があります。

ILMergeは、ライブラリをEXEにマージする方が優れていると思います。そのため、ファイルが多数ではなく1つになります。

于 2008-10-31T01:35:20.723 に答える