2

.NET Framework (2.0) が依存アセンブリを解決する方法について質問があります。

現在、大規模な ASP.NET アプリケーションとさまざまなサテライト実行可能ファイルを少し書き直しています。解決するために新しい API を開発した基礎クラスには、いくつかの厄介な問題もあります。これまでのところ、これは通常の更新ですが、広範囲に及んでいます。

私たちの階層は次のとおりです。

  1. ASP.NET (aspx)
  2. ビジネス ロジック (DLL)
  3. 基礎クラス (DLL)

そのため、ASP.NET は適合しません。一部の DLL (特に基礎クラス) には、古い名前空間/関数を含むリダイレクト レイヤーがあり、それらを新しい API に転送します。DLL を置き換えたとき、ASP.NET はそれらを正常に検出しました (おそらく、再コンパイルがトリガーされたためです)。

ただし、両方の DLL セットに同じ名前空間とクラスが含まれていても、プリコンパイル済みアプリケーションはそうではありません。ファイルの名前が変更された場合でも、assemblyname 属性が異なる (必要に応じて変更する必要がある) ことについて不平を言います。同じアセンブリの異なるバージョンにリダイレクトできることは知っていますが、完全に異なるアセンブリにリダイレクトする方法はありますか?

別の方法としては、アプリケーションを再コンパイルするか (アプリケーション自体は変更されていないため、あまりやりたくない)、新しい基本 DLL を参照するスタブを使用して古い基本 DLL を再コンパイルします (新しいダミー DLL はファイル システムが乱雑です)。

4

3 に答える 3

2

タイプを新しいアセンブリに移動しますか? でそれを行うことができます[TypeForwardedTo(..)]

( ) をお持ちの場合AssemblyA:

namespace SomeNamespace {
    public class SomeType {}
}

代わりに、そのタイプを に移動しAssemblyBて、実質的に空AssemblyAで、参照AssemblyBして単純に含むことができます。

[assembly: TypeForwardedTo(typeof(SomeNamespace.SomeType))]

SomeNamespace.SomeType次に、からロードしようとするものは、AssemblyA 実際には から型を取得しAssemblyBます。

ほとんどのランタイムはこの属性を尊重します... WCF 拡張機能を除くすべて。私を噛んだ;-pああ、それはネストされた型のファンではありません...

于 2010-04-07T19:36:00.663 に答える
0

<assemblyBinding>設定ファイルに設定を追加してみましたか?

http://msdn.microsoft.com/en-us/library/twy1dw1e.aspx

于 2012-01-31T16:24:47.450 に答える
0
//File: RKAPPLET.EXE
namespace RKAPPLET
{
  using RKMFC;
  public static class Program
  {
    public static void Main ()
    {
      RKMFC.API.DoSomething();
    }
  }
}

//File: RKMFC.DLL
namespace RKMFC
{
  public static class API
  {
    public static void DoSomething ()
    {
      System.Windows.Forms.MessageBox.Show("MFC!")
    }
  }
}

//File: RKNET.DLL
namespace RKNET
{
  public static class API
  {
    public static void DoSomethingElse ()
    {
      System.Windows.Forms.MessageBox.Show("NET!")
    }
  }
}
namespace RKMFC
{
  public static class API
  {
    public static void DoSomething ()
    {
      RKNET.API.DoSomethingElse()
    }
  }
}

RKMFC.DLL でコンパイルされた RKAPPLET.EXE が、RKMAPPLET.EXE (それを指すため) または RKMFC.DLL (それを指すため) を再コンパイルせずに、RKNET.DLL (RKMFC.DLL 内のすべてのコピーといくつかのコピーを含む) を検索するようにします。リダイレクトの種類)。

于 2010-04-08T12:19:43.603 に答える