2009-03-03 5 views
0

私は3つのdll ProjBL.dll、ProjDL.dllおよびProjMC.dllを持っています。Assembly.Load()メソッドを使用するために、依存するアセンブリをメモリにロードする方法

ProjBL.dllは、ビジネス・オブジェクトのdll

ProjDL.dllは、データアクセス層方式のDLL

ProjMC.dllであるマスタークラスのdllがProjDL.dllがProjMC.dllに依存プロパティ

が含まれているとProjDL.dllはProjDL.dllに依存します

私は、指定されたフォルダを持つD:ドライブのフォルダからAssembly.Load()メソッドを使用してメモリにProjBL.dllをロードしています。

現在は使用された方法

を「依存アセンブリの一が見つからない」というエラーが発生します

DirectoryInfo dllDirectory = new DirectoryInfo(folderPath); 
    FileInfo[] dllFiles = dllDirectory.GetFiles("*.dll"); 
    int dllCount = dllFiles.Length; 
    FileStream fs = null;   
    if (dllCount > 0) 
    { 
     long streamLength = 0; 
     for (int fileCount = 0; fileCount < dllCount; fileCount++) 
     { 
      fs = new FileStream(dllFiles[fileCount].FullName, FileMode.Open); 
      streamLength += fs.Length; 
      fs.Close(); 
     } 
     byte[] memory = new byte[streamLength]; 
     byte[] memory1 = null; 
     byte[] memory2 = null; 
     byte[] memory3 = null; 

     fs = new FileStream(dllFiles[0].FullName, FileMode.Open); 
     BinaryReader br = new BinaryReader(fs); 
     memory1 = br.ReadBytes(Convert.ToInt32(fs.Length)); // Loads ProjMC.dll 

     fs = new FileStream(dllFiles[1].FullName, FileMode.Open); 
     br = new BinaryReader(fs); 
     memory2 = br.ReadBytes(Convert.ToInt32(fs.Length)); // Loads ProjDA.dll 


     fs = new FileStream(dllFiles[2].FullName, FileMode.Open); 
     br = new BinaryReader(fs); 
     memory3 = br.ReadBytes(Convert.ToInt32(fs.Length)); // Loads ProjBL.dll 

     fs.Close(); 
     br.Close(); 

     memory1.CopyTo(memory, 0); 
     memory2.CopyTo(memory, memory1.Length); 
     memory3.CopyTo(memory, (memory1.Length + memory2.Length)); 

     assemblyUsed = Assembly.Load(memory); 

    }   
    return assemblyUsed; 

答えて

0

なぜそんなに複雑で、次のようにありますか? Assembly.LoadFrom(string)はうまく仕事をします。あるいは、あなたは本当に奇妙な行動を達成しようとしていますか?

0

ProjB.dllにProjMC.dllが必要なProjDL.dllが必要なので、ProjBL.dllを読み込むときに、CLRがProjDL.dllとProjMC.dll(およびその他の依存関係)を検出できる必要があります。

実行可能ファイルと同じディレクトリにあるか、probepathにある場合は、そのファイルを見つけることができるはずです。 fuslogvwを使用すると、CLRが依存するアセンブリを探している場所を知ることができます。

0

現在のアプリケーションがアセンブリを探すとき、アセンブリが見つからない場合、いくつかの場所(binフォルダ、gacなど)を検索します。これを行うには、AssemblyResolveイベントをインターセプトし、イベント引数を使用してアセンブリがどこにあるかをCLRに伝えます。

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
.................... 
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var assemblyPath= 
      Path.GetFullPath("..\\..\\..\\example\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"); 

    return Assembly.LoadFrom(assemblyPath); 
}