无法使ShadowCopy正常工作

时间:2014-10-21 08:12:33

标签: .net vb.net appdomain shadow-copy

我在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被加载到应用程序域并打印“运行”,但目录mCachePath为空,我无法在应用程序运行时修改/删除Assembly2.dll,为什么当我告诉它使用它时,不要.net使用卷影复制功能。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,将Assembly.LoadFile替换为Assembly.LoadFrom,它就行了,不要问我为什么......