2009-03-03 1 views
0

У меня есть три DLL-файла ProjBL.dll, ProjDL.dll и ProjMC.dll.Как загрузить зависимую сборку в памяти для использования метода Assembly.Load()

ProjBL.dll является бизнес-объекта DLL

ProjDL.dll является метод доступа к данным слой DLL

ProjMC.dll является DLL Мастер-класс содержит свойства

ProjDL.dll зависит от ProjMC.dll и ProjBL.dll зависит от ProjDL.dll

У меня есть загрузка ProjBL.dll в память с использованием метода Assembly.Load() из папки на диске D: с указанной папкой.

В настоящее время он дает ошибку, что «один из зависимых собрания не найден»

Метод, используемый как ниже

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

Поскольку ProjBL.dll нуждается в файле ProjDL.dll, для которого требуется ProjMC.dll, при загрузке ProjBL.dll CLR необходимо будет найти файлы ProjDL.dll и ProjMC.dll (и любые другие зависимости).

Он должен быть в состоянии найти их, если они находятся в том же каталоге, что и исполняемый файл или в пробной версии. Вы можете использовать fuslogvw, чтобы узнать, где CLR ищет зависимые сборки.

0

Когда текущее приложение ищет сборки, оно выглядит в нескольких местах (папка bin, gac и т. Д.), Если он не может его найти, тогда разработчику необходимо вручную указать приложение, где искать. Вы можете сделать это, перехватив событие AssemblyResolve и используя аргументы event, чтобы сообщить 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); 
}