Чтобы проверить, существует ли конкретная ссылка на проект (код C #, директивы препроцессора ...) - PullRequest
3 голосов
/ 23 февраля 2011

Я довольно новичок в C # / .NET, поэтому я надеюсь, что есть решение для моей проблемы.

Я работаю с 2 различными библиотеками обработки изображений, которые имеют свои собственные классы для представления изображений. Поскольку я не хочу использовать эти классы в своей собственной (частной) библиотеке классов, я хочу реализовать свой собственный класс "myImage", который должен быть оберткой вокруг обоих других классов. (Я, конечно, должен добавить функциональность библиотек, если они отсутствуют).

Моя проблема теперь в основном такая: класс myImage требует ссылки на обе библиотеки для компиляции, однако иногда я хотел бы использовать класс myImage в проектах, где доступна только одна библиотека. Мне не трудно «добавить» или «удалить» ссылки на мой проект класса изображений, однако я не хочу комментировать код, который ссылается на отсутствующую библиотеку.

Итак, мой вопрос: возможно ли как-то определить, установлена ​​ли ссылка с помощью директивы предварительной обработки или с атрибутами или непосредственно с кодом? Или есть даже лучшее решение для моей проблемы (может быть, умный дизайн класса?)

Спасибо за помощь

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

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

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

Теперь, когда вы хотите использовать некоторые функции обработки изображений, вы используете этот интерфейс и передаете тот конкретный экземпляр сторонней библиотеки, которую вы хотите использовать.

Если это не применимо в вашем случае, пожалуйста, объясните немного подробнее, почему вы хотите инкапсулировать две библиотеки.

1 голос
/ 23 февраля 2011

Я не думаю, что есть директива препроцессора, которая сообщит вам, была ли добавлена ​​ссылка.

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

Я бы использовал 2 условных символа компиляции (см. Свойства | Сборка), один для методов, специфичных для первой библиотеки, другой для второй библиотеки.Всякий раз, когда код класса ссылается на элементы данных или функции, специфичные для библиотеки, он будет окружен директивой #if со ссылкой на соответствующий символ.

Если вы не собираетесь присоединяться к классам, Рида и Дэниеларешения, вероятно, более уместны.

1 голос
/ 23 февраля 2011

Лучшим вариантом было бы, чтобы ваша оболочка определяла интерфейс. Затем вы можете использовать две отдельные сборки (библиотеки) для каждой из библиотек обработки изображений, которые могли бы реализовать интерфейс.

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

Это позволяет полностью изолировать 2 библиотеки, а также предоставляет гибкость для расширения этой возможности с другими версиями / библиотеками в будущем.

...