2015-06-12 31 views
2

我试图加载第三方assemblies动态到项目和使用reflection来创建它们的类型的实例。如何动态地将程序集加载到当前应用程序域到c#项目中?

我用:

Assembly.LoadFrom("Assembly1.dll") 
Assembly.LoadFrom("Assembly2.dll") 
Assembly.LoadFrom("Assembly3.dll") 

此外,尝试:

AppDomain.CurrentDomain.Load("Assembly1.dll") 
AppDomain.CurrentDomain.Load("Assembly2.dll") 
AppDomain.CurrentDomain.Load("Assembly3.dll") 

不过,我不断收到The method is not implemented例外,当我尝试创建自己的类型如下的一个实例:

Assembly.LoadFrom("Assembly1.dll") 
Assembly.LoadFrom("Assembly2.dll") 
Assembly assembly= Assembly.LoadFrom("Assembly3.dll") 
Type type=assembly.GetType("Assembly3.Class1") 
object instance=Activator.CreateInstance(type); //throws exception at this point 

但是,如果我直接add reference作为sembly1,Assembly2和Assembly3项目做:

Assembly3.Class1 testClass=new Assembly3.Class1(); 

我没有得到任何例外

我只是想知道我做错了吗?如何动态地将组件加载到项目。我猜是因为创建Class1实例取决于另一个程序集Assembly1Assembly2,所以它失败了。那么,如何将所有相关程序集动态加载到appdomain/loadcontext

非常感谢您的回答。

+0

在另一个线程中回复:http://stackoverflow.com/a/18362459/4997569 – ArcangelZith

+0

不是真的!只加载_one assembly_并实例化它的'type'。我已经尝试过了。但没有奏效。我**多个程序集**加载到“当前上下文”并创建一个实例 –

回答

1

对于解决依赖关系,你需要处理AppDomain.AssemblyResolve Event

using System; 
using System.Reflection; 

class ExampleClass 
{ 
    static void Main() 
    { 
     AppDomain ad = AppDomain.CurrentDomain; 

     ad.AssemblyResolve += MyAssemblyResolveHandler; 

     Assembly assembly = ad.Load("Assembly3.dll"); 

     Type type = assembly.GetType("Assembly3.Class1"); 

     try 
     { 
      object instance = Activator.CreateInstance(type); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    static Assembly MyAssemblyResolveHandler(object source, ResolveEventArgs e) 
    { 
     // Assembly.LoadFrom("Assembly1.dll") 
     // Assembly.LoadFrom("Assembly2.dll") 

     return Assembly.Load(e.Name); 
    } 
} 

MyAssemblyResolveHandler引发了比不装,包括依赖每个装配。

+0

这将得到一个无限循环,因为调用Assembly.Load(e.name)调用CurrentDomain的ResolveHandler – cdie

0

当使用“ad.AssemblyResolve + = MyAssemblyResolveHandler”时,我得到了由'cdie'描述的无限循环。

所以我试了几件事。以下是通过MSDNs LoadFrom link

public object InitClassFromExternalAssembly(string dllPath, string className) 
{ 
    try 
    { 
     Assembly assembly = Assembly.LoadFrom(dllPath); 
     Type type = assembly.GetType(className); 
     var instance = Activator.CreateInstance(type); 
     return instance; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
     throw; 
    } 
} 

显然,Assembly.LoadFrom方法要求DLL的完整路径。

请注意在链接中通过LoadFrom加载程序集时可能出现的问题。

此外,'ArcangelZith'包含的link有一些有趣的想法。

相关问题