2009-10-21 6 views
1

a. Моя программа C# загрузит dll (которая является динамической), а теперь давайте возьмем a.dll (аналогично моя программа будет загружать больше dll, например b.dll, c.dll и т. Д.).не удалось загрузить dll или его зависимость

b. Моя программа вызовет метод «Onstart» внутри a.dll (он постоянный для всех dll).

Я могу достичь вышеуказанных 2 случаев с помощью механизма отражения.

Проблема

a. Если у моего a.dll есть какая-либо ссылка, скажите xx.dll или yy.dll, тогда при попытке вызвать

OnStart метод a.dll из моей программы. Я получаю «невозможно загрузить dll или одну из его зависимостей». Смотрите фрагмент кода

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 

foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 

     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

обычно я получаю сообщение об ошибке в строке «объект OBJ = Activator.CreateInstance (ф);» это потому, что у a.dll есть ссылка на xx.dll, но в моей программе у меня нет ссылки на xx.dll. Кроме того, я не могу иметь ссылку на xx.dll в моей программе, потому что a.dll является внешней сборкой и может иметь любую ссылку на нее.

Kinldy help !!!

ответ

0

Возможно, вторая ссылка на DLL недоступна для вашего приложения?

Убедитесь, что вторая DLL находится в том же каталоге, что и первая DLL, или что приложение настроено на поиск в каталоге, имеющем вторую DLL.

0

Думаю, ему нужно больше объяснений. Позвольте мне объяснить ....

a. Моя программа на C# будет загружать dll (что является динамическим), теперь давайте возьмем a.dll (аналогично больше dll, например b.dll, c.dll и т. Д.).

b. Моя программа вызовет метод «Onstart» (постоянный для всех dll) внутри a.dll.

Я могу достичь вышеуказанных 2 случаев с помощью механизма отражения.

Проблема

a. Если у моего a.dll есть какая-либо ссылка, скажите xx.dll или yy.dll, тогда при попытке вызвать

OnStart метод a.dll из моего програ. Я получаю «невозможно загрузить dll или одну из его зависимостей».

Смотрите фрагмент кода

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 
foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 
     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

Обычно я получаю сообщение об ошибке в строке "объект OBJ = Activator.CreateInstance (ф);" Это потому, что у a.dll есть ссылка xx.dll, но я не могу иметь то же самое. Кроме того, у меня не может быть ссылки на xx.dll в моей программе, потому что a.dll динамичен и может иметь любую ссылку на свой собственный.

0

Я думаю, вы не можете сделать ничего, кроме добавления всех ссылок, которые используются. ps: обычно внешняя сборка должна быть полной для использования (или пакет будет содержать все необходимые сборки, чтобы вы могли их добавить)

1

Посмотрите на это: http://bytes.com/topic/c-sharp/answers/232691-how-dynamically-load-assembly-w-dependencies. В основном, в событии AssemblyResolve вам необходимо вручную загрузить ссылочные сборки.

private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e) 
{ 
    try 
    { 
     string[] assemblyDetail = e.Name.Split(','); 
     string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll"); 
     return assembly; 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Failed resolving assembly", ex); 
    } 
} 

Не лучший код, но должен дать вам общее представление, я надеюсь.

Я, однако, согласен с тем, что плагины-dll должны быть упакованы для полного, без использования использования. Если им разрешено загружать сборки, которые у вас нет, то кто знает, что может случиться.

Смежные вопросы