.NET替换依赖程序集而不重新编译?

时间:2010-04-07 19:32:17

标签: c# .net assemblies resolve

我有一个关于.NET框架(2.0)如何解析依赖程序集的问题。

我们目前正在对一个大型ASP.NET应用程序和各种卫星可执行文件进行一些重写。我们的基础课也存在一些棘手的问题,我们开发了一个新的API来解决。到目前为止,这是一个正常的,虽然广泛的更新。

我们的heirarchy是:

  1. ASP.NET(aspx)
  2. 业务逻辑(DLL)
  3. 基础类(DLL)
  4. 因此,ASP.NET没有合适,一些DLL(特别是基础类)有一个包含旧命名空间/函数的重定向层,并将它们转发到新的API。当我们替换DLL时,ASP.NET很好地选择了它们(可能是因为它触发了重新编译)。

    预编译的应用程序不会,尽管两个DLL集中都有相同的名称空间和类。即使文件被重命名,它也会抱怨assemblyname属性不同(必须根据需要)。我知道你可以重定向到同一个程序集的differentnet 版本,但有没有办法指向一个完全不同的程序集?

    替代方法是重新编译应用程序(不是真的想要,因为应用程序本身没有改变)或重新编译旧的基础DLL,使用存根引用新的基础DLL(新的虚拟DLL是文件系统混乱)

3 个答案:

答案 0 :(得分:2)

您想将类型移动到新程序集吗?您可以使用[TypeForwardedTo(..)]

执行此操作

如果您最初有(AssemblyA):

namespace SomeNamespace {
    public class SomeType {}
}

您可以将该类型转移到AssemblyB,并且几乎为空AssemblyA,引用AssemblyB并且只包含:

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

然后,试图从SomeNamespace.SomeType 加载AssemblyA的任何内容实际都会从AssemblyB获取类型。

大多数运行时都尊重此属性...除了WCF扩展之外的所有内容。哪个位我; -p哦,它不是嵌套类型的粉丝......

答案 1 :(得分: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来查找RKNET.DLL(其中包含RKMFC.DLL中的所有内容的副本,然后是一些),而无需重新编译RKAPPLET.EXE(指向它)或RKMFC。 DLL(重定向类型)。

答案 2 :(得分:0)

您是否尝试将<assemblyBinding>设置添加到配置文件?

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