2009-10-21 72 views
1

a。我的C#程序将加载一个dll(这是动态的),现在我们来看看a.dll(同样,我的程序会加载更多dll,比如b.dll,c.dll等)。无法加载dll或其依赖项之一

b。我的程序将在a.dll中调用一个“Onstart”方法(对于所有的dll来说它是不变的)。

我能通过反射机制实现上述2种情况。

问题是

a。如果我的a.dll有任何参考说xx.dll或yy.dll,那么当我尝试调用

从我的程序的OnStart方法。我得到“无法加载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(TP);”这是因为a.dll引用了xx.dll,但在我的程序中我没有引用xx.dll。此外,我不能在我的程序中引用xx.dll,因为a.dll是一个外部程序集,可以有任何自己的参考。

Kinldy help !!!

回答

0

也许第二个DLL引用不适用于您的应用程序?

确保第二个DLL与第一个DLL位于同一目录中,或者应用程序配置为在具有第二个DLL的目录中查找。

0

我想,这需要更多的解释。让我解释一下......

a。我的C#程序将加载一个dll(这是动态的),现在让我们来看看a.dll(类似b.dll,c.dll等更多的DLL)。

b。我的程序将在a.dll中调用一个方法“Onstart”(它对所有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(TP);” 这是因为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); 
    } 
} 

不是最好的代码,但应该给你一个大概的想法,我希望。

但是,我确实认为应该将plugin-dll打包以实现完全无依赖性的使用。如果他们被允许加载程序集,那么你无法控制,那么谁知道会发生什么。

相关问题