【发布时间】:2012-04-16 13:41:20
【问题描述】:
我正在使用 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 事件的情况下它们工作正常。我能够从同一个AppDomain 中的每个位置访问动态加载的Assembly 中的类型。
LoadFrom() 可以在同一个请求的程序集路径中自动找到依赖项,这不是问题,因为 dll 需要的一切都在那里。所以起初它对我来说看起来像是一个AppDomain 问题,因为它似乎可以从Load 上下文而不是LoadFrom 上下文访问程序集,我现在正在使用LoadFrom 上下文。
- 但现在看来我应该通过
oAssemblyinstance evertwhere 来使用加载程序集中的任何类型? - 它不会加载程序集,我可以使用简单的
Type.GetType(...)方法在任何地方(相同的 AppDomain)访问它吗?
有人可以补一下我的问题并回答我的问题吗?
你可以用C#,其实我不喜欢VB.NET,但我必须在Office中使用它。
【问题讨论】:
-
我们需要更多信息。使用 LoadFile 和 LoadFrom 加载程序集。比较生成的 Assembly Location 和 FullName 属性。此外,尝试在 Type.GetType 调用中添加程序集的全名。您在“MyFolder”和应用程序 EXE 的文件夹中是否有该程序集或其任何依赖项的多个副本?您是否使用多个 AppDomain?多线程?该项目是否托管在 IIS 中?还是其他一些影子复制系统?如果在LoadFrom之前调用GetType,是否成功?大会的位置和全名是什么?
-
您能否发布一个更完整的测试应用程序来重复问题,以便我们进行测试。是您一直失败的原因,还是取决于加载的路径/程序集,是否存在同一程序集的多个版本等。
-
您似乎说
LoadFrom并在LoadFrom返回的完全限定程序集名称上使用Type.GetType(string),如果不设置AssemblyResolve事件处理程序就无法工作。但是,您在事件处理程序中使用的路径C:\PSIOBJ\...和 LoadFrom 行中的路径C:\MyFolder\...不匹配。这是剪切和粘贴错误,还是您实际上加载了不同的程序集?
标签: c# .net vb.net assemblies