是否可以将程序集标记为已弃用?

时间:2010-12-17 21:46:58

标签: c# .net

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

不幸的是,看起来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中保留存根类只是为了将程序集标记为已废弃

3 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分: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...
}

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

答案 2 :(得分:4)

我在MSDN上看不到任何具体内容。但是,您可以创建自己的汇编属性,但前提是您认为它非常重要。然后,这样做并不妨碍某人使用它,我不知道你怎么能让别人知道它已被弃用。

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

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