0

我在程序集 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 阴影当我告诉它使用它时复制功能。

4

1 回答 1

0

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

于 2014-10-21T11:28:56.113 回答