无法让卷影复制正常工作



我在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,它很有效。不要问我为什么。。。

相关内容

  • 没有找到相关文章

最新更新