7

サードパーティの dllとマージされる単一のdllを作成したいと考えています。これは、エンド コンシューマーが 2 つではなく 1 つの dll のみを処理する必要があることを意味します。

補強のために、サードパーティの dll は nLog であるとしましょう。マージされた dll のコンシューマーがプロジェクトで参照として NLog を既に持っている場合、どのように対処すればよいですか?

理想的には、プロジェクト内の NLog 名前空間を「XyzNLog」に変更することです。これは、ユーザーがエイリアシングを行う必要がないことを意味します...どうすればこれを行うことができるでしょうか?

これで、NLog のプロジェクトにエイリアスを追加して、それを XyzNLog として参照する必要があることがわかりましたが、競合が発生しないように、マージされた dll のコンシューマーにも同じエイリアスを適用したいと考えています。

更新 - 解決策

http://blog.mattbrailsford.com/2010/12/10/avoiding-dependency-conflicts-using-ilmerge/

ビンゴ!したがって、ILMerge を使用することで、サードパーティ ライブラリ DLL をプロバイダー独自の DLL とマージすることが可能になります。つまり、展開する DLL は 1 つだけになります。しかし、それだけではありません。実際にはさらに一歩進んで、ILMerge にすべての依存関係を内部化するように指示できます。これにより、すべてのサード パーティ クラスが内部として宣言されるように変換されます。つまり、これらのクラスは、最終的な DLL 内からのみ使用できます。ウーフー!問題は解決しました =)

これを考えると、私のdllの消費者もNLogを持つことができるという問題がなくなります...参照されているNLogがすべて内部に移行するためです! これはまさに私が欲しいものです。

誰かがこれについてフィードバックや考えを持っていますか?

4

2 に答える 2

1

私はハンスに同意します。DLLを個別に登録してリリースすることを強くお勧めします。

そうでなければ、あなたはあなたの消費者を追い払うであろうDLL地獄にいる可能性があります。

次に、DLLがすでに登録されているかどうかを検出するために、いくつかの巧妙なデプロイ方法を考案することができます。

于 2011-05-02T02:18:23.417 に答える
0

私は@Hans Passantに同意する必要があります(そして、よく議論されるDLL地獄に関する情報があります)が、あなたが質問したので、私はそれに答えようとします.

サードパーティの DLL をリソースとしてバンドルできます。詳しくはこちらの質問をご覧ください。

他の質問に関しては、サードパーティの DLL から関連するクラスを独自の名前空間で公開し、拡張メソッドを使用して必要な追加機能を提供するだけです。

たとえばLog()、クラスの静的メソッドを使用して、NLog のメソッドへのアクセスを提供できます。たとえばXyzNLog.Logger.Log()、コード内で初期化を処理したり、内部的にその他のもの (静的コンストラクターなど) を作成したりできます。上記の方法を使用して NLog アセンブリを読み込むため、埋め込まれた NLog アセンブリに直接アクセスできるのはあなただけであり、ユーザーはアクセスできません。現在、すべてのクラスを NLog から自動公開する利点は得られません。この場合でも、それらを手動で公開する必要があります。

編集: 別のアプローチは、ここで説明されているように /internalize フラグを指定して ILMerge を使用することです。問題を完全に解決することはできないかもしれませんが、この記事を見て、著者が説明した落とし穴を回避できるかどうかを確認してください。ネタバレ注意:これもすべてピーチズアンドクリームではありませんが、十分な努力をすればうまくいくかもしれません.

于 2011-05-02T02:22:04.427 に答える