Как обнаружить отсутствующую ссылку .NET во время выполнения? - PullRequest
6 голосов
/ 27 июля 2011

Мое приложение содержит ссылки на внешнюю библиотеку (объекты управления SQL Server).По-видимому, если библиотека отсутствует в системе времени выполнения, приложение все еще работает , пока не вызваны методы, которые используют классы из этой библиотеки .

Вопрос 1: Это заданное поведение или просто (счастливый) побочный эффект от того, как CLR загружает библиотеки?

Чтобы определить, доступна ли ссылка, я в настоящее время использую код, подобный этому:

Function IsLibraryAvailable() As Boolean
    Try
        TestMethod()
    Catch ex As FileNotFoundException
        Return False
    End Try
    Return True
End Function

Sub TestMethod()
    Dim srv As New Smo.Server()  ' Try to create an object in the library
End Sub

Это работает, но кажется довольно уродливым.Обратите внимание, что это работает только в том случае, если TestMethod является отдельным методом, в противном случае исключение будет выдано в начало из IsLibraryAvailable (до try-catch, даже если создание экземпляра объекта происходит в блоке try-catch).

Вопрос 2: есть ли лучшая альтернатива?

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

1 Ответ

4 голосов
/ 27 июля 2011

Это ожидается, поскольку JIT ленив на уровне метода.Обратите внимание, что встраивание здесь не является проблемой, поскольку это также проблема JIT, а не проблема компилятора.

Лучшие параметры:

  • убедитесь, что приложение установлено со всем, что ононеобходимо
  • с использованием ilmerge или подобного для создания отдельной сборки (если возможно)

Лично я бы просто использовал первый вариант.

...