Существуют ли какие-либо символы при компиляции переносимой библиотеки классов, которые можно использовать с директивами препроцессора?

Я добавил в свое решение переносимую библиотеку классов, в которой есть глобальный файл, связанный со всеми проектами. Этот глобальный файл содержит атрибуты уровня сборки, такие как версия, культура и видимость Com. Проблема, которую я хочу решить, заключается в том, что некоторые атрибуты, такие как ComVisible, недействительны в контексте PCL, поэтому есть ли какой-либо символ, который используется с #if для предотвращения включения этого атрибута во время сборки?


person Tedford    schedule 17.04.2012    source источник


Ответы (2)


Я преодолел эту проблему, добавив классы атрибутов-заглушек/фиктивных атрибутов в компактный фреймворк, которые имитируют их аналоги FCL:

// Shared source file
[ComVisible(true)]
public class Foo
{
}

// Dummy class in portable project -- exists only to facilitate compilation of the shared source file
namespace System
{
    [AttributeUsage(AttributeTarget.Class)]
    public class ComVisibleAttribute : Attribute
    {
        public ComVisibleAttribue(bool visible)
        {
            // Dummy implementation
        }
    }
}

Теперь общий файл исходного кода будет компилироваться в обоих проектах без каких-либо изменений в коде и без каких-либо директив препроцессора.

person MattDavey    schedule 17.04.2012
comment
Мэтт, спасибо за нестандартное мышление! Это тоже жизнеспособное решение. - person Tedford; 17.04.2012
comment
@MattDavey Извините за опоздание на вечеринку, но я не думаю, что это рекомендуемое решение (поправьте меня, если я ошибаюсь). ComVisibleAttribute недоступен в PCL, но есть в большинстве целей. Поэтому всякий раз, когда вы хотите использовать PCL в определенной цели, например, в приложении .NET, вы столкнетесь с конфликтом имен. Я думаю, что вы можете обойти эту проблему с помощью TypeForwardedToAttribute, но у меня нет опыта в этом. - person Anders Gustafsson; 05.12.2013

Вы можете настроить свои собственные символы препроцессора в свойствах сборки. Я не знаю, существуют ли какие-либо конкретные библиотеки по по умолчанию для переносимых библиотек классов, но было бы несложно указать их в каждой конфигурации для вашего проекта.

person Jon Skeet    schedule 17.04.2012
comment
Спасибо Джон, я искал встроенный, но это имеет смысл и экономит время! - person Tedford; 17.04.2012