Вопрос

Можно ли создать библиотеку, которая будет использоваться из .Net 2.0, а также позволит потребителям .Net 3.0+ воспользоваться DataContracts, если они того пожелают?

Я не вижу никаких технических препятствий для этого, кроме библиотеки, которая содержит различные атрибуты, связанные с DataContract, - библиотеки .Net 3.0. Могут ли эти атрибуты быть реализованы вручную аналогично ExtensionMethodAttribute?

Это было полезно?

Решение

Если вы добавляете атрибуты .NET 3.0 в сборку, а затем запускаете ее на компьютере только с .NET 2.0, это означает наличие атрибута в вашем коде из сборки, недоступной во время выполнения.

Это в основном будет работать нормально, если приложение .NET 2.0 на самом деле не пытается прочитать атрибуты. Например, следующий код вызовет исключение FileNotFoundException, поскольку он не сможет загрузить System.ServiceModel.dll при запуске на компьютере с .NET 2.0:

[ServiceContract] // Attribute from System.ServiceModel.dll
class MyClass
{
  ...
}
...
    // this will throw a FileNotFoundException if System.ServiceModel.dll is not available
    object[] attributes = typeof(MyClass).GetCustomAttributes(false);

Поэтому, если вы не знаете, кто будет использовать вашу библиотеку классов, вы не можете на 100% гарантировать, что вы их не сломаете.

Этого можно избежать, отправив копию приложения System.ServiceModel.dll (или другой сборки, содержащей используемые вами атрибуты) вместе с вашим приложением или (я думаю) с помощью перегрузки GetCustomAttributes, которая принимает System.Type. аргумент, поэтому вы читаете только те атрибуты, о которых известно, что они доступны.

Другие советы

Поскольку в .NET 2.0 и .NET 3.0 и 3.5 используется один и тот же CLR (2.0), у вас не должно возникнуть никаких проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top