Если вы добавляете атрибуты .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. аргумент, поэтому вы читаете только те атрибуты, о которых известно, что они доступны.