2

我有一个关于 .NET 框架 (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 找到 RKNET.DLL(它具有 RKMFC.DLL 中所有内容的副本,然后是一些),而无需重新编译 RKAPPLET.EXE(指向它)或 RKMFC.DLL(指向重定向类型)。

于 2010-04-08T12:19:43.603 回答