动态加载库

时间:2016-02-28 12:10:26

标签: c# asp.net-web-api reflection types system.reflection

我有以下项目结构:

  1. Web API
  2. 班级图书馆A
  3. 班级图书馆B
  4. 班级图书馆C
  5. 这些是项目之间的参考

    • 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模块在​​查找其类型之前加载到内存中。

    有什么建议吗?

2 个答案:

答案 0 :(得分:2)

简单的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"));

祝你好运, 彼得

答案 1 :(得分:1)

修改了Peter的答案,但逻辑更加正确,因为他的合并失败,并且没有理由创建URL来获取本地文件路径。

using System.Reflection;
using System.IO;

var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var myAssembly = Assembly.LoadFrom(Path.Combine(appDir, "MyAssebmly.dll"));