Ответ 1
При перемещении типов из одной сборки в другую правильная вещь - использовать тип форвардера, а не для обозначения старых классов сборки как устаревших.
Я хочу создать предупреждающее сообщение, когда пользователи компилируют код, который ссылается на сборку, которую мы планируем удалить. Содержимое этой сборки было объединено с другим, и я бы хотел, чтобы пользователи перестали ссылаться на старую сборку.
К сожалению, похоже, что 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 только для того, чтобы отметить сборку как устаревшую.
При перемещении типов из одной сборки в другую правильная вещь - использовать тип форвардера, а не для обозначения старых классов сборки как устаревших.
Я не вижу ничего конкретного в MSDN. Однако вы можете создать свой собственный атрибут сборки, но только если вы считаете, что это важно. Опять же, это не мешает кому-либо использовать его, и я не уверен, как вы могли бы даже сообщить кому-то, что он устарел.
Честно говоря, я думаю, что я бы разместил [Obsolete]
в общедоступных классах.
На основании того, что я прочитал в сообщении @Eric и ссылки, которую он предоставил вместе с комментарием WS, используйте [TypeForwardedTo]
.
Отметьте каждый из классов старой сборки как непригодный.
Это сработало для меня:
[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...
}
Я только что протестировал это, и он также работал (т.е. скомпилирование не удалось)