0

同様の質問がたくさん見つかりましたが、解決策が見つかりませんでした。

私は次のコードを持っています:

    string file = "c:\\abc.dll";
    AppDomainSetup ads = new AppDomainSetup();
    ads.PrivateBinPath = Path.GetDirectoryName(file);
    AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads);
    ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName); 

Assembly asm = proxy.GetAssembly(file); // exception File.IO assembly not found is thrown here after succesfully running the funktion GetAssembly.


  public class ProxyDomain : MarshalByRefObject
  {
     public Assembly GetAssembly(string assemblyPath)
     {
        try
        {
           Assembly asm = Assembly.LoadFile(assemblyPath);
           //...asm is initialized correctly, I can see everything with debugger
           return asm;
        }
        catch
        {
           return null;
        }
     }
  }

最も興味深いのは、GetAssembly 関数が他の型を返すことです。カスタムのシリアル化可能なクラスであっても、すべて問題ありません。誰かが私が欠けているものを知っていますか? または、ロードされたアセンブリを別のドメインに戻すことは不可能ですか?

ありがとうございました

4

1 に答える 1

0

File.IOメインアプリケーションの bin ディレクトリに座っていると思いますか? もしそうなら、あなたの abc.dll はそれを見つける場所を知りません (あなたのメイン アプリケーションも に置かれている場合を除きますC:\\)。

次のいずれかを行う必要があります

  1. Bindイベントに移動しAppDomain.AssemblyResolve、参照された dll を手動でロードします
  2. AppDomainSetupのベース ディレクトリを変更します(これは.NET、dll を探すことがわかっている場所の 1 つです) 。
  3. にインストールFile.IOします(これは、DLLを探すことがわかっているGAC別の場所です).NET
  4. File.IOの場所をAppDomainSetup のプライベート プローブ パスに追加します (これは.NET、dll を検索しようとする場所の 1 つです)。
于 2012-12-08T20:01:26.507 に答える