2009-06-04 5 views
1

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

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

ответ

1

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

Мое решение:

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

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

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

1

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

var x = typeof(SomeTypeInSomeAssembly); 

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

+0

Да. К сожалению, это должно быть во время компиляции, иначе компилятор попытается скомпилировать это время и увидеть, что он отсутствует. Конечно, я мог бы просто определить свой собственный тип с той же структурой/подписями, но это кажется очень взломанным для меня. – Noldorin

1

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

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

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

+0

Это, вероятно, ближе к тому, что мне нужно. Я сам думал о том, чтобы использовать директиву #if вместе со сценарием предварительной сборки, который определяет константу тогда и только тогда, когда определенная ссылка может быть разрешена. – Noldorin