Я добавил в свое решение переносимую библиотеку классов, в которой есть глобальный файл, связанный со всеми проектами. Этот глобальный файл содержит атрибуты уровня сборки, такие как версия, культура и видимость Com. Проблема, которую я хочу решить, заключается в том, что некоторые атрибуты, такие как ComVisible, недействительны в контексте PCL, поэтому есть ли какой-либо символ, который используется с #if для предотвращения включения этого атрибута во время сборки?
Существуют ли какие-либо символы при компиляции переносимой библиотеки классов, которые можно использовать с директивами препроцессора?
Ответы (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
Мэтт, спасибо за нестандартное мышление! Это тоже жизнеспособное решение.
- person Tedford; 17.04.2012
@MattDavey Извините за опоздание на вечеринку, но я не думаю, что это рекомендуемое решение (поправьте меня, если я ошибаюсь).
ComVisibleAttribute
недоступен в PCL, но есть в большинстве целей. Поэтому всякий раз, когда вы хотите использовать PCL в определенной цели, например, в приложении .NET, вы столкнетесь с конфликтом имен. Я думаю, что вы можете обойти эту проблему с помощью TypeForwardedToAttribute
, но у меня нет опыта в этом.
- person Anders Gustafsson; 05.12.2013
Вы можете настроить свои собственные символы препроцессора в свойствах сборки. Я не знаю, существуют ли какие-либо конкретные библиотеки по по умолчанию для переносимых библиотек классов, но было бы несложно указать их в каждой конфигурации для вашего проекта.
person
Jon Skeet
schedule
17.04.2012
Спасибо Джон, я искал встроенный, но это имеет смысл и экономит время!
- person Tedford; 17.04.2012