C# .NET是否在不重新编译的情况下替换依赖程序集?
我有一个关于.NET framework(2.0)如何解析依赖程序集的问题 我们目前正在重写一个大型ASP.NET应用程序和各种卫星可执行文件。我们的基础类也存在一些烦扰的问题,我们开发了一个新的API来解决。到目前为止,这是一个正常的,尽管影响广泛的更新 我们的继承权是:C# .NET是否在不重新编译的情况下替换依赖程序集?,c#,.net,assemblies,resolve,C#,.net,Assemblies,Resolve,我有一个关于.NET framework(2.0)如何解析依赖程序集的问题 我们目前正在重写一个大型ASP.NET应用程序和各种卫星可执行文件。我们的基础类也存在一些烦扰的问题,我们开发了一个新的API来解决。到目前为止,这是一个正常的,尽管影响广泛的更新 我们的继承权是: ASP.NET(aspx) 业务逻辑(DLL) 基础课程(DLL) 所以ASP.NET不抛出一个合适的,一些DLL(特别是基础类)有一个重定向层,包含旧的命名空间/函数,并将它们转发给新的API。当我们更换DLL时,ASP.
所以ASP.NET不抛出一个合适的,一些DLL(特别是基础类)有一个重定向层,包含旧的命名空间/函数,并将它们转发给新的API。当我们更换DLL时,ASP.NET很好地处理了它们(可能是因为它触发了重新编译)
尽管两组DLL中都有相同的名称空间和类,但预编译的应用程序不会这样做。即使文件被重命名,它也会抱怨assemblyname属性不同(必须如此)。我知道你可以重定向到同一个程序集的不同版本,但是有没有办法直接到一个完全不同的程序集替代方案是重新编译应用程序(不真的想因为应用程序本身没有改变)或者重新编译旧的基础DLL,用存根引用新的基础DLL(新的虚拟DLL是文件系统杂波)。< /P> < P>您想将类型移动到新的程序集吗?您可以使用
[TypeForwardedTo(..)]
来实现这一点
如果您最初有(AssemblyA
):
您可以将该类型移动到AssemblyB
,并拥有一个几乎为空的AssemblyA
,它引用AssemblyB
,只包含:
[assembly: TypeForwardedTo(typeof(SomeNamespace.SomeType))]
然后,试图从AssemblyA
加载SomeNamespace.SomeType
的任何东西实际上都会从AssemblyB
获取类型
大多数运行时都尊重此属性。。。除了WCF扩展之外的所有功能。咬了我一口-哦,它不喜欢嵌套类型
//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(重定向类型).您是否尝试添加了
我希望不必对原始应用程序或旧API库进行任何修改就可以成功。虽然TypeForwarder是一个有趣的概念,但它在本例中不起作用。RK1.DLL具有RK1.API.FUNCTION()。RK2.DLL包含RK2.API.Function()和RK1.API1.Function(),后者将转发回RK2.API2.Function()。正因为如此,RK1.DLL和RK2.DLL不能被同一个应用程序调用,如果我试图将一个类型转发到它认为是它自己的类型,我猜想编译器会呕吐。我只是想找到一种方法来删除RK2.DLL,将RK1.DLL重命名为RK1.notaDLL,然后让应用程序工作。我只是惊讶于框架支持在运行时强制应用程序按版本重定向,但没有办法(我发现)在不重新编译的情况下转发到另一个程序集。@RK-暗中瞎拍;您是否尝试过AppDomain.CurrentDomain.AssemblyResolve
?如果它找不到第一个程序集,您可以处理它并返回新程序集(通过assembly.Load(newName))
…是的,我确实找到了该选项,但似乎仍需要重新编译调用方应用程序。如果我仍要重新编译应用程序,我最好在重新编译时将引用指向正确的文件。现在第一次调查类型转发-您能在没有从AssemblyA到AssemblyB的引用的情况下执行此操作吗我试图在已经存在相反方向的依赖关系的情况下执行此操作:(
//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()
}
}
}