给定一个.NET DLL,它包含一个“Place”类和一个返回整数的函数“Where”;我需要将dll加载到应用程序域中,执行该函数并卸载应用程序域。
Dim domain As AppDomain = AppDomain.CreateDomain("Executor")
Dim buffer() As Byte = IO.File.ReadAllBytes("c:\path\Locator.dll")
Dim asy As Assembly = domain.Load(buffer)
Dim obj As [Object] = asy.CreateInstance("Locator.Place")
Dim method As MethodInfo = obj.GetType.GetMethod("Where")
Dim result as Integer = method.Invoke(obj, New [Object]() { 1 })
AppDomain.Unload(domain)
此行失败:
Dim asy As Assembly = domain.Load(buffer)
出现此错误消息:
'Could not load file or assembly 'Place, Version=1.0.0.0, Culture=neutral, PublicKeyToken-null' or one of it's dependencies. The System Cannot find the specified file.'
文件在缓冲区中,所以我猜它是一个依赖.dll。但是,它应该在基本程序目录中找到它们。
关于错误原因的任何想法?
任何经过测试的示例代码,用于将程序集加载到AppDomain,Execting a function,然后卸载AppDomain,我们将不胜感激。
(顺便说一句,我用谷歌搜索过,没有找到任何有用的样本。)
答案 0 :(得分:1)
说明错误是由于缺少引用,你说得对。由于您正在加载程序集的方式,最有可能无法解析引用。由于您是从字节数组加载的,因此Assembly.Location不会指向dll的位置。由于您引用的dll不在GAC中,因此无法找到引用的程序集。尝试直接从文件加载程序集,而不是先加载到字节数组中。
答案 1 :(得分:0)
如果您想知道无法加载哪些依赖项,请尝试使用fuslogvw。查看http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx
我发现link text的解释非常好。它说明了一些陷阱,并提供了应该很容易翻译成VB.NET的示例代码。
我希望这会有所帮助。