.NET заменить зависимые сборки без перекомпиляции? - PullRequest
2 голосов
/ 07 апреля 2010

У меня есть вопрос о том, как .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 - беспорядок в файловой системе).

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

Вы хотите переместить типы в новую сборку? Вы можете сделать это с [TypeForwardedTo(..)].

Если у вас изначально есть (AssemblyA):

namespace SomeNamespace {
    public class SomeType {}
}

Вместо этого вы можете переместить этот тип в AssemblyB и получить практически пустой AssemblyA, который ссылается на AssemblyB и просто содержит:

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

Тогда все, что пытается загрузить SomeNamespace.SomeType из AssemblyA , на самом деле получает тип из AssemblyB.

Большая часть времени выполнения учитывает этот атрибут ... все, кроме расширений WCF. Который укусил меня ;-p О, и это не фанат вложенных типов ...

0 голосов
/ 31 января 2012

Вы пытались добавить настройку <assemblyBinding> в файл конфигурации?

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

0 голосов
/ 08 апреля 2010
//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()
    }
  }
}

Я хочу, чтобы RKAPPLET.EXE, скомпилированный с RKMFC.DLL, мог найти RKNET.DLL (в котором есть копия всего в RKMFC.DLL, а затем и некоторую) без перекомпиляции либо RKAPPLET.EXE (чтобы указать на него), либо RKMFC. DLL (для перенаправления типов).

...