动态加载库

Loading library dynamically

我有以下项目结构:

  1. Web API
  2. Class图书馆A
  3. Class图书馆B
  4. Class图书馆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 函数不是 return 有效路径。除此之外,我想创建一种更好的方法来确保 B 模块在查找其类型之前已加载到内存中。

有什么建议吗?

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

此致, 彼得

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

using System.Reflection;
using System.IO;

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