使用TypeForwardedToAttribute的正确方法是什么? - c#

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

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

然后,我创建一个控制台应用程序项目,添加“动物”作为参考,并在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类(实际上,在Animal中不再有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

使用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),

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”作为所有参考
其中。

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

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

编辑:

我重新编译整个解决方案,
希望控制台应用程序可以打印
“新版本”。但这给了我一个
编译错误:

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

找不到类型名称“狗”
在“动物”名称空间中。这种类型
已转发给大会
'高级动物

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

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…

如何使用JavaScript访问嵌入式ASP.NET GlobalResources? - javascript

我正在开发一个遗留的ASP.NET项目,该项目正试图缓慢地进行调整,但是如果没有像巧克力手指屋一样塌陷的情况,我将无法进行重大更改。我试图为此找到解决方案,但由于术语的特定混合(“ javascript”,“ embedded”和/或“ resource”只是为我提供了有关如何嵌入.js文件的信息,而失败了)。 。),这可能是一种怪异的处理方式。该项目将Ap…