3

私の目的は、指定された 2 つのフォルダー間で欠落している依存関係のチェックを行うことです。次の設定を想像してください。

ルート\DirA\A.dll

ルート\DirB\B.dll

B は A に依存します。

したがって、これらのフォルダーを指定して、新しい AppDomain を作成し、B.dll をロードして、DirA(A.dll) からの依存関係を自動的に解決し、その新しい AppDomain で分離します。

この AppDomain をアンロードするときに、潜在的に DirA を依存関係として持つ新しいものを作成したいのですが、それを必要とする DirC ライブラリがあるため、DirC が DirB にも依存している場合は、分離が重要です。例外。

編集:私の質問をよりよく説明するのに役立つ場合に備えて、コード例を追加します。

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = @"C:\Root";
setup.ApplicationName = "Isolated Domain"
setup.PrivateBinPath = @"DirA;DirB";
setup.PrivateBinPathProbe = "";//disable search in AppBase..
var domain = AppDomain.CreateDomain(Guid.NewGuid().ToString(),
                                    AppDomain.CurrentDomain.Evidence,
                                    setup,
                                    AppDomain.CurrentDomain.PermissionSet);
//The following statement in theory should pick B.dll's dependency from DirA.
var assembly = domain.Load(AssemblyName.GetAssemblyName(@"C:\Root\DirB\B.dll").Name);
//Do the same in a different domain for C.dll

それについて助けてくれてありがとう。

4

2 に答える 2

3

これはResolveEventHandlerのジョブのように見えます (不明なアセンブリの解決に関する MSDN の詳細)

だから、あなたは次のようなものを書くことができます

class MyResolver
{
  public static Assembly MyResolveEventHandler( Object sender, ResolveEventArgs args )
  {
    // confirm args.Name contains A.dll
    String dllName = args.Name.Split({','}, SplitStringOptions.None)[0];
    if (dllName == "A")
    {
      return Assembly.LoadFile(@"C:\Root\DirA\A.dll")
    }
    return null;
  }
}

作成したドメインで、次のことを行います。

domain.AssemblyResolve += new ResolveEventHandler(MyResolver.MyResolveEventHandler);

B で A を参照する前に、必ずイベントをバインドしてください。

于 2012-08-17T16:11:25.820 に答える
1

AppDomain は、最初のフォルダーの外にある dll をプローブできません。彼らは、GAC と、PrivateBinPath でフォルダーのより深い部分をプローブできますが、他のフォルダーをプローブすることはできません。

于 2012-08-16T16:00:18.637 に答える