我在Assembly 1 中有以下代码
Public Interface ITest
Sub Run()
End Interface
Public Class Runner
Inherits MarshalByRefObject
Public Sub Run(pluginPath As String)
For Each assemblyPath As String In Directory.GetFiles(pluginPath, "*.dll", SearchOption.AllDirectories)
ScanAssemblyForTasks(assemblyPath)
Next
End Sub
Private Sub ScanAssemblyForTasks(assemblyPath As String)
Dim assembly As Assembly = assembly.LoadFile(assemblyPath)
For Each type As Type In assembly.GetTypes().Where(Function(t) t.IsClass AndAlso
Not t.IsAbstract AndAlso
Not t.IsGenericType AndAlso
GetType(ITest).IsAssignableFrom(t))
Dim test As ITest = CType(type.GetConstructor(type.EmptyTypes).Invoke(Nothing), ITest)
test.Run()
Next
End Sub
End Class
Module Module1
Private mAppDomain As AppDomain
Private mCachePath As String
Private mPluginDirectory As String
Private mRunner As Runner
Sub Main()
mCachePath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "ShadowCache")
mPluginDirectory = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Assemblies")
If (Not Directory.Exists(mCachePath)) Then
Directory.CreateDirectory(mCachePath)
End If
If (Not Directory.Exists(mPluginDirectory)) Then
Directory.CreateDirectory(mPluginDirectory)
End If
Console.WriteLine("Press any key to load assemblies")
Console.ReadKey()
Dim setup As New AppDomainSetup()
setup.ApplicationName = "MyApplication"
setup.ShadowCopyFiles = "true"
setup.CachePath = mCachePath
setup.ShadowCopyDirectories = mPluginDirectory
setup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
mAppDomain = AppDomain.CreateDomain("MyApplication", AppDomain.CurrentDomain.Evidence, setup)
mRunner = CType(mAppDomain.CreateInstanceAndUnwrap(GetType(Runner).Assembly.FullName, GetType(Runner).FullName), Runner)
mRunner.Run(mPluginDirectory)
Console.WriteLine("Press any key to end application")
Console.ReadKey()
End Sub
End Module
在位于mPluginDirectory
的Assembly2中,我有以下代码
Public Class Class1
Implements ITest
Public Sub Run() Implements ITest.Run
Console.WriteLine("Run")
End Sub
End Class
当我运行应用程序时,Assembly2加载到应用程序域并打印"run",但目录mCachePath
为空,并且在应用程序运行时我无法修改/删除Assembly2.dll,为什么我告诉.net使用卷影复制功能时不使用它呢?
我找到了一个解决方案,用Assembly.LoadFrom
替换Assembly.LoadFile
,它很有效。不要问我为什么。。。