Мы создали небольшой компонент, который принимает Id, ищет запись в базе данных для сборки / пространства имен / класса и динамически загружает экземпляр класса, который нам нужен. До сих пор он работал нормально, но при запуске этого кода в VS 2010 происходит сбой.
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
If (asmb.Location = assemblyFile)) Then Return asmb
Next
Return Nothing
End Function
Первая проблема заключается в том, что когда итератор попадает в динамическую сборку, отсутствует asmb.Location и генерируется исключение NotSupportedException. Есть ли способ проверить наличие поля Unsupported-ness в поле Location без необходимости перехвата исключения?
Вторая проблема, asmb.Location, возвращает весь путь, а не только имя файла, что означает, что эта функция не выполняется каждый раз. Если эта функция определяет, что класс еще не загружен, мы пытаемся загрузить его и получить исключение AccessViolationException, поскольку класс уже загружен, и мы не можем «перезагрузить» его.
Изменение функции на это работает:
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
Try
If (asmb.Location.EndsWith(assemblyFile)) Then Return asmb
Catch ex As NotSupportedException
Continue For
End Try
Next
Return Nothing
End Function
Но он кажется грязным. Есть ли лучший способ проверить, загружена ли сборка, и передать ее вызывающей стороне? Вышеуказанные проблемы характерны для .NET 4.0 или Visual Studio 2010? Я не пробовал это вне среды IDE, так как это требует довольно значительной настройки.