我正在使用Assembly.LoadFrom()
加载程序集,因为这些程序集位于应用程序基目录之外的其他路径中。
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
事件也能正常工作。我能够从同一个AppDomain
中的任何地方访问动态加载的Assembly
中的类型。
LoadFrom()
可以在请求的程序集路径内自动查找依赖项,这不应该是问题,因为dll
需要的一切都在那里。因此,起初它看起来像是一个AppDomain
问题,因为它似乎可以从Load
上下文而不是LoadFrom
上下文访问程序集,而我现在正在使用LoadFrom
上下文。1. 但现在似乎我应该将
oAssembly
实例传递到每个地方才能使用已加载程序集中的任何类型?
2. 它不会加载程序集,以便我可以使用简单的Type.GetType(...)
方法在任何地方(同一AppDomain)访问它吗?请问有人能填补缺失的点并回答我的问题吗?
您可以使用C#,实际上我不喜欢VB.NET,但我必须在这里在Office中使用它。
LoadFrom
和使用Type.GetType(string)
在LoadFrom
返回的完全限定程序集名称上,如果没有设置AssemblyResolve
事件处理程序是行不通的。然而,你在事件处理程序中使用的路径C:\PSIOBJ\...
和LoadFrom
行中的路径C:\MyFolder\...
不匹配。这是剪切和粘贴错误吗?还是你实际上加载了不同的程序集? - Abel