我有一个关于.NET框架(2.0)如何解析依赖程序集的问题。
我们目前正在对一个大型ASP.NET应用程序和各种卫星可执行文件进行一些重写。我们的基础课也存在一些棘手的问题,我们开发了一个新的API来解决。到目前为止,这是一个正常的,虽然广泛的更新。
我们的heirarchy是:
因此,ASP.NET没有合适,一些DLL(特别是基础类)有一个包含旧命名空间/函数的重定向层,并将它们转发到新的API。当我们替换DLL时,ASP.NET很好地选择了它们(可能是因为它触发了重新编译)。
预编译的应用程序不会,尽管两个DLL集中都有相同的名称空间和类。即使文件被重命名,它也会抱怨assemblyname属性不同(必须根据需要)。我知道你可以重定向到同一个程序集的differentnet 版本,但有没有办法指向一个完全不同的程序集?
替代方法是重新编译应用程序(不是真的想要,因为应用程序本身没有改变)或重新编译旧的基础DLL,使用存根引用新的基础DLL(新的虚拟DLL是文件系统混乱)
答案 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>
设置添加到配置文件?