我在程序集 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
在位于我的 Assembly2 中,mPluginDirectory
我有以下代码
Public Class Class1
Implements ITest
Public Sub Run() Implements ITest.Run
Console.WriteLine("Run")
End Sub
End Class
当我运行应用程序时,Assembly2 被加载到应用程序域并打印“运行”,但目录mCachePath
是空的,我无法在应用程序运行时修改/删除 Assembly2.dll,为什么不使用 .net 阴影当我告诉它使用它时复制功能。