2016-02-28 68 views
0

我有以下项目结构:加载库动态

  1. Web API
  2. 类库A
  3. 类库B
  4. 类库C

这些都是间引用项目

  • Web API直接引用AB
  • B直接引用C

C具有需要确保A加载通过反射,它定义的类型来使用,的方法。

我的代码实际上是类似以下

public class C { 
    public void MethodCallingBType(string fullClassName) { 
     //e.g. "MyNamespace.MyType, MyNamespace" 
     string[] parts = fullClassName.Split(','); 
     var className = parts[0].Trim(); 
     var assemblyName = parts[1].Trim(); 
     if (!string.IsNullOrEmpty(assemblyName) && !string.IsNullOrEmpty(className)) { 
      string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
      string assemblyPath = Path.Combine(assemblyFolder, assemblyName + ".dll"); 
      if (File.Exists(assemblyPath)) { 
       Assembly assembly = Assembly.LoadFrom(assemblyPath); 
       Type type = assembly.GetType(className); 
       result = Activator.CreateInstance(type) as IInterfaceRunner; 
      } 
     } 
    } 
} 

这段代码实际上为Path.GetDirectoryName函数不返回一个有效的路径是行不通的。除此之外,我想创建一个更好的方法确保B模块在查找其类型之前加载到内存中。

有什么建议吗?

+1

检查装配基本目录和私有路径;) – TomTom

+0

@TomTom:组件中都Web Api项目的bin文件夹 – Lorenzo

+1

检查基本目录和私有路径。你没有读过AppDomain的属性吗?有超过GetExecutingAssembly;)他们在那里rae;) – TomTom

回答

1

简单的Assembly.Load不起作用?你不必知道位置,只有名字。

我用同样的情况Assembly.CodeBase和正常工作:

string codebase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; 
Uri p = new Uri(codebase); 
string localPath = p.LocalPath; 
var myassembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(localPath, "MyAssebmly.dll")); 

最好的问候, 彼得

+0

伟大的谢谢你。不知道CodeBase属性成员。 – Lorenzo