.net 控制如何将P/调用的程序集加载到不同的应用程序域

.net 控制如何将P/调用的程序集加载到不同的应用程序域,.net,assemblies,appdomain,.net,Assemblies,Appdomain,我有一个应用程序需要调用dll中的非托管代码。我需要从多个应用程序域执行这些调用,并特别希望程序集多次加载到内存中(每个应用程序域一次) 我试着做了以下几点: Dim AppDomainSetup As New AppDomainSetup With AppDomainSetup .PrivateBinPath = "<Blah>" .LoaderOptimization = LoaderOptimization.MultiDomain

我有一个应用程序需要调用dll中的非托管代码。我需要从多个应用程序域执行这些调用,并特别希望程序集多次加载到内存中(每个应用程序域一次)

我试着做了以下几点:

    Dim AppDomainSetup As New AppDomainSetup
    With AppDomainSetup
        .PrivateBinPath = "<Blah>"
        .LoaderOptimization = LoaderOptimization.MultiDomainHost
    End With

    Dim AppDomain As AppDomain = AppDomain.CreateDomain(String.Format("AppDomain-{0}", AppDomainCounter), Nothing, AppDomainSetup)
    AppDomainCounter += 1

    Dim Manager = CType(
        AppDomain.
        CreateInstanceAndUnwrap(
            System.Reflection.Assembly.
            GetExecutingAssembly.FullName,
        "<My Manager Class>"), AppDomainManager)
    Return Manager
然而,在做了一些测试之后,似乎只有一个程序集(实例?)正在加载并在应用程序域之间共享。我希望
AppDomain.LoaderOptimization
设置会强制每个域都有一个唯一的副本


是否有任何方法可以强制CLR多次加载程序集?

是的,这无法工作。AppDomain仅对托管程序集有意义。由[DllImport]后面的底层调用LoadLibrary()加载的任何本机DLL都由进程共享。加载同一本机DLL的多个副本的唯一方法是在磁盘上有多个副本,所有副本的名称都不同。“这不能很好地扩展,应该避免。”HansPassant感谢您的回复。不幸的是,所讨论的DLL不是线程安全的,但我需要以多线程的方式使用它。那么,我的最佳选择是生成多个进程吗?这似乎是一个很大的开销,但我没有看到很多选择。我总是可以自动复制DLL,但这似乎是一个巨大的难题。如果不这样做,我想我需要雇一个C++程序员来让它安全运行…另外,如果你想用“你不能”作为答案,我会接受的,你肯定是走错了路。唯一合理的方法是创建多个进程,每个进程加载自己的DLL副本,以便严格分离它们的实例数据。然后使用.NET互操作机制(如WCF)让这些进程与主进程对话。@HansPassant明白,thanks@HansPassant你介意把你的评论摘要转载给我吗?这样我就可以接受了?我正在做一个小小的春季大扫除:)非常感谢
<DllImport("<Path>",
    EntryPoint:="<MethodName>",
    CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function <MethodName>(
                                    <InAttribute(),
                                    MarshalAsAttribute(UnmanagedType.LPStr)>
                                    ByVal sig1 As String,
                                    <InAttribute(),
                                    MarshalAsAttribute(UnmanagedType.LPStr)>
                                    ByVal sig2 As String) As Integer