Проверка наличия ссылки / типа во время компиляции в .NET - PullRequest
2 голосов
/ 05 июня 2009

Недавно я обнаружил необходимость проверить в время компиляции : а) существует ли определенная ссылка на сборку и может ли она быть успешно разрешена, или б) определенный класс (полное имя которого известно) определяется. Эти две ситуации эквивалентны для моих целей, поэтому достаточно было бы проверить наличие одной из них. Есть ли способ сделать это в .NET / C #? Директивы препроцессора изначально показались мне чем-то, что могло бы помочь, но, похоже, у них нет необходимых возможностей.

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

Ответы [ 3 ]

1 голос
/ 05 июня 2009

Звучит так, будто вы хотите, чтобы компилятор игнорировал одну ветвь кода, что на самом деле выполнимо, только скрывая ее за блоком #if. Будет ли определение константы компилятора и использование #if работать в ваших целях?

#if MyConstant
.... code here that uses the type ....
#else
.... workaround code ....
#endif

Другой вариант - вообще не зависеть от другого класса во время компиляции и использовать для этого отражение или динамическое ключевое слово .NET 4.0. Если он будет неоднократно вызываться в критически важном сценарии в .NET 3.5 или более ранней версии, вы можете использовать DynamicMethod для создания кода при первом использовании вместо использования отражения каждый раз.

1 голос
/ 06 июня 2009

Кажется, я нашел здесь решение, хотя и не совсем то, на что я изначально надеялся.

Мое решение:

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

Альтернатива:

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

1 голос
/ 05 июня 2009

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

var x = typeof(SomeTypeInSomeAssembly);

Если сборка, содержащая SomeTypeInSomeAssembly, не указана и недоступна, она не будет скомпилирована.

...