我在this postthis one中遇到了这个属性。当我们需要升级旧系统时,这似乎很有用。然后,创建一个测试解决方案(其中包含3个项目)以使用此属性。首先,有一个名为“动物”的类库项目。

namespace Animal
{
   public class Dog
   {
      public static string Name = "old version";
   }
}

然后,我创建一个控制台应用程序项目,添加“Animal”作为引用,在Main方法中,我有:
Console.WriteLine(Animal.Dog.Name);

现在,它会打印“旧版本”。伟大的!现在,我开始“升级”现有项目。我在“动物”中删除类Dog,添加另一个名为“AdvancedAnimal”的类库项目,其中包含:
namespace Animal
{
   public class Dog
   {
      public static string Name = "new version";
   }
}

在“动物”中添加“AdvancedAnimal”作为引用。还通过添加以下内容来修改“动物”的AssemblyInfo.cs:
[assembly: TypeForwardedTo(typeof(Animal.Dog))]

从此属性的使用开始,从现在开始,所有Animal.Dog都转发到“AdvancedAnimal”中的Dog类(实际上,“动物”中不再有Dog类)。我重新编译了整个解决方案,并希望控制台应用程序打印“新版本”。但这给了我一个编译错误:
The type name 'Dog' could not be found in the namespace 'Animal'. This type has been forwarded to assembly 'AdvancedAnimal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' Consider adding a reference to that assembly.
哦,我被告知要添加“AdvancedAnimal”作为对我的控制台应用程序的引用!但是,如果这样做,就不再需要该属性,因为如果在控制台应用程序中添加“AdvancedAnimal”作为引用,那么Animal.Dog当然会引用“AdvancedAnimal”中的那个!我期望的是修改“动物”,添加“AdvancedAnimal”,无需更改所有其他项目/类库,因为程序集信息已经提供了足够的信息。升级系统时确实很方便。否则,我有20个引用“动物”的项目,我需要添加“AdvancedAnimal”作为对所有它们的引用。更重要的是,在此解决方案中我找不到“TypeForwardedToAttribute”的任何用法,删除它并不重要。您能告诉我我的考试/想法有什么问题吗?

最佳答案

the documentation for TypeForwardedToAttribute :



但是您正在做的是将类型从同一程序集转发到同一程序集中的另一种类型。这没有任何意义。

让我们说清楚。假设程序集oldAssembly.dll中是否有类狗

namespace Animal
{
   public class Dog
   {
      public void printName() {
           console.writeline("old version");
      }
   }
}

并在其他程序集(x.dll)中引用了它
   Dog dg=new Dog();
   dg.printName()

以后,您想更改printName功能,但不要触摸调用方(x.dll)(假设是否已部署dll,并且不想触摸该DLL)

因此您创建了一个新的程序集(dll),
namespace AdvancedAnimal
{
   public class Dog
   {
      public void printName() {
           console.writeline("new version");
      }
   }
}

现在,您可以通过添加对新dll的引用并添加来重新编译旧的dll。
[assembly:TypeForwardedTo(typeof(AdvancedAnimal.Dog))]

现在,对A​​nimal.Dog进行的所有调用都会转发到AdvancedAnimal.Dog。

所以



您不必将AdvancedAnimal添加到所有20个项目中。您所要做的就是将AdvancedAnimal添加到Animal。

希望这澄清了有用的上下文

编辑:



整个问题的关键是我们可以在不修改调用方的情况下调用新程序集。您不应该重新编译整个解决方案,因为您的调用方仍然指向旧程序集中的方法。这就是为什么你得到错误



只需重新编译您的旧装配和新装配,并将其放入调用方容器中并运行exe即可。它会像魅力一样工作。

10-01 04:55