能否将程序集标记为已弃用?

31

我希望在用户编译引用我们计划删除的程序集时产生警告消息。 这个程序集的内容已经与另一个程序集合并,我想鼓励用户停止引用旧的程序集。

不幸的是,似乎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中留下存根类来标记程序集已过时。" 为什么不这样做? - Flipster
这会在同时引用Assembly1和Assembly2的项目中导致名称冲突,对吧?因为类已经被移动而没有更改它们的名称。 - Greg
TypeForwardedTo 是一个程序集属性,而不是类属性。因此,在 Assembly1 中你将不需要留下一个存根类。 - Brian
没错,但为了将类标记为过时并为用户生成编译器警告,我需要这样做。 - Greg
3个回答

33

10
如果有人想知道的话:该属性是TypeForwardedTo(http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.typeforwardedtoattribute.aspx)。 - VVS
引用的文章无法访问。 - nothrow
8年后,我正在重新组织我们公司使用的一些基础设施dll文件——主要是重命名等操作。我们使用内部NuGet服务器来共享这些dll文件。所有dll文件的用例都是同一家小公司内的应用程序。有些dll文件被5-6个应用程序使用,有些则更少。那么,我应该仍然优先选择类型转发而不是过时的方法吗? - Zohar Peled

5

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

以下方法适用于我:

[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...
}

我刚才测试了一下,也是这样的(编译失败)。

4
我在MSDN上没有看到任何具体内容。不过,您可以创建自己的程序集特性,但只有在您认为它非常重要时才需要这样做。然而,这样做并不能阻止其他人使用它,也不确定如何让其他人知道它已被弃用。
老实说,我会在公开可访问的类上放置[Obsolete]
根据我在@Eric的帖子和他提供的链接以及WS的评论中所读到的内容,使用[TypeForwardedTo]

该程序集中没有公开可访问的类。我已将其中所有类移动到另一个程序集中,并仅保留旧程序集,以便用户现有的代码无需更改即可编译。 - Greg
Greg:根据定义,现有程序集中目前存在公开可访问的类。请标记这些类。 - NotMe
我已经编辑了我的问题,更好地描述了程序集的状态。所有可公开访问的类都已从已弃用的程序集移动到仍然有效的程序集中。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接