Я загружаю сборку, используя Assembly.LoadFrom()
, так как сборки расположены по другому пути, чем каталог Application Base.
Dim oAssembly As Assembly = _
Assembly.LoadFrom("C:\\MyFolder\\" + ddlXlate.SelectedItem.ToString() + ".dll")
И я без проблем потребляю Type
из этой сборки:
oXML = CType(oAssembly.CreateInstance(sBaseType + ".XlateContainer"), _
XlateBase.XlateContainer)
Однако проблема возникает, когда я пытаюсь использовать Type
из этой сборки из другого метода, подобного приведенному ниже:
oComboBox.DataSource = _
[Enum].GetValues(Type.GetType(sType + "+ItemEnum," + sAssemblyName))
sAssemblyName
- это тот, который я загружал, используя LoadFrom()
на самом деле. После того, как он сказал, что не может найти сборку, я использовал событие AssemblyResolve
, которое решило мою проблему:
Подписка AssemblyResolve
событие:
AddHandler AppDomain.CurrentDomain.AssemblyResolve, _
AddressOf MyResolveEventHandler
Метод обработчика событий:
Private Shared Function MyResolveEventHandler(ByVal sender As Object, _
ByVal args As ResolveEventArgs) As Assembly
Return Assembly.LoadFrom("C:\\PSIOBJ\\" + args.Name + ".dll")
End Function
И я подумал, что, возможно, ошибка возникает из-за того, что он не может найти зависимую сборку, определенную в файле манифеста сборки, который я уже загружал с использованием LoadFrom()
, но когда я проверил args.Name
, я увидел, что он пытается загрузить ту же сборку, и после этого это работало без проблем. Таким образом, в основном тип в загруженной сборке не может быть найден до события, добавляющего изменение.
В моем старом коде использовались методы AppDomain.CurrentDomain.Load()
и Assembly.Load()
, и они работали нормально без события AssemblyResolve
. Я был в состоянии достигнуть типов в динамически загруженных Assembly
отовсюду в пределах того же AppDomain
.
LoadFrom()
может автоматически находить зависимости в пределах одного и того же запрошенного пути сборки, и это не могло быть проблемой, поскольку все, что нужно dll
, было там. Поэтому сначала это выглядело как проблема AppDomain
, так как похоже, что он может достигать сборок из контекста Load
вместо контекста LoadFrom
, и теперь я использую контекст LoadFrom
.
- Но теперь, похоже, я должен передать
oAssembly
экземпляр evertwhere, чтобы использовать любой тип из загруженной сборки?
- Разве он не загружает сборку, где я могу найти его везде (тот же AppDomain), используя простой метод
Type.GetType(...)
?
Может кто-нибудь заполнить пропущенные баллы и ответить на мои вопросы?
Вы можете использовать C #, на самом деле мне не нравится VB.NET, но я должен использовать его здесь, в Office.