【问题标题】:Is it possible to mark an assembly as deprecated?是否可以将程序集标记为已弃用?
【发布时间】:2011-05-27 09:02:59
【问题描述】:

当用户编译引用我们计划删除的程序集的代码时,我想生成一条警告消息。此程序集的内容已与另一个程序集合并,我想鼓励用户停止引用旧程序集。

不幸的是,ObsoleteAttribute 似乎对程序集无效。在构建引用程序集的项目时,是否有任何其他方式导致编译器警告?

谢谢。

编辑:为澄清起见,以下是合并前后程序集的样子

合并前:

Assembly1:
namespace A.B.C {
    class C1
    ...
}

Assembly2:
namespace A.B.D {
    class D1
    ...
}

合并后:

Assembly1:
(empty)

Assembly2:
namespace A.B.C {
    class C1
    ...
}

namespace A.B.D {
    class D1
    ...
}

在合并之前,用户同时引用了 Assembly1 和 Assembly2。合并后,他们只需要引用 Assembly2,但我宁愿警告说不再需要 Assembly1,而不是通过立即删除 Assembly1 来破坏他们的构建。

听起来我应该使用类型转发器来确保已经针对这些程序集构建的程序继续工作而无需重新编译,但我不想将存根类留在 Assembly1 中只是为了将程序集标记为过时.

【问题讨论】:

  • “我不想将存根类留在 Assembly1 中,只是为了将程序集标记为过时。”为什么不呢?
  • 在同时引用 Assembly1 和 Assembly2 的项目中会导致名称冲突,对吧?由于类已被移动而没有更改其名称。
  • TypeForwardedTo 是程序集属性,而不是类属性。因此,您无需在 Assembly1 中留下存根类。
  • 对,但我需要将这些类标记为已过时,以便为用户生成编译器警告。

标签: c# .net


【解决方案1】:

将类型从一个程序集移动到另一个正确的做法是使用type forwarder,而不是将旧的程序集类标记为过时。

见:"CLR Hoser - The Wonders of Whidbey Factoring Features – Part I: Type Forwarders" by Richard Lander (2005)

【讨论】:

  • 如果有人想知道:属性是TypeForwardedTo (msdn.microsoft.com/en-us/library/…)
  • 无法访问引用的文章。
  • 8 年多之后,我正在重新组织我们公司使用的一些基础设施 dll——主要是重命名之类的东西。我们正在使用内部 nuget 服务器来共享这些 dll。 dll 的所有用例都是同一小公司内的应用程序。一些 dll 被 5-6 个应用程序使用,有些则更少。那么我还是应该更喜欢类型转发而不是过时的?
【解决方案2】:

将旧程序集中的每个类标记为不可用。

这对我有用:

[Obsolete("Deprecated.  Use 'Substitute' class in 'NewAssembly' instead.")]
public class OutdatedClass : IDisposable, IXmlSerializable
{ 
    //code...
}

在尝试编译时,我收到了大量关于使用该类的警告。

您可以通过将 True 作为第二个参数传递给属性来使其引用程序集成为编译错误。

[Obsolete("Deprecated.  Use 'Substitute' class in 'NewAssembly' instead.", true)]

public class OutdatedClass : IDisposable, IXmlSerializable
{ 
    //code...
}

我刚刚测试过,它也有效(即 - 编译失败)

【讨论】:

    【解决方案3】:

    我在 MSDN 上没有看到任何具体内容。但是,您可以创建自己的程序集属性,但前提是您认为它很重要。再说一次,这样做并不能阻止某人使用它,而且我不确定你怎么能让别人知道它已被弃用。

    老实说,我想我会将[Obsolete] 放在可公开访问的课程上。

    根据我在 @Eric 的帖子中阅读的内容以及他提供的链接以及 WS 的评论,请使用 [TypeForwardedTo]

    【讨论】:

    • 程序集中没有可公开访问的类。我已将所有类从它移到另一个程序集中,并且只保留旧程序集,因此用户的现有代码不需要更改即可编译。
    • Greg:根据定义,现有程序集中当前存在可公开访问的类。标记那些。
    • 我已经编辑了我的问题以更好地描述程序集的状态。所有可公开访问的类都已从已弃用的程序集移至仍然有效的程序集。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2014-08-20
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多