动态DLL加载引用问题

时间:2017-09-02 09:31:00

标签: c# .net dynamic .net-assembly restsharp

在使用共享引用动态加载库时,我遇到了问题。我明白问题可能在哪里,但我真的不知道如何解决它。

我会尝试更好地解释我的问题,这是我的结构:

我有3个装配

  • DataProviderAssembly
  • ContractsAppAssembly
  • AppAssembly

我开始说我目前无法使用MEF。

" DataProviderAssembly"在语言上加载" AppAssembly"因为它有一个从" ContractsAssembly"实现IApp接口的类型。 按照下面的代码,当我尝试从App类调用方法OnSignRequest时,我得到一个MissingMethodException。似乎找不到该方法,但是,如果我删除" RestRequest"参数,一切正常。 我认为,该DLL的动态加载会遗漏一些依赖程序集的参考信息。

**ContractsAppAssembly**
public interface IApp {
    void GetData();
}

public abstract class MainClassBase : IApp {
   public virtual void GetData(){
        //Do Stuff
   }
    protected void OnSignRequest(RestRequest request){
        //calling sign request event
    }
}

public abstract class SecondClassBase : MainClassBase {
    // i need this because it overrides other methods i didn't specify here
}

**AppAssembly**
public class App : SecondClassBase {
    public override void GetData(){

        RestRequest request = new RestRequest();
        base.OnSignRequest(request);//<-- this throws a MissingMethodException
    }
}

**DataProviderAssembly**
public class DataProvider{
    public DataProvider{
        string[] appsLibs = Directory.GetFiles(appsFolderPath, "*.dll", SearchOption.TopDirectoryOnly);
        foreach (string appLib in appsLibs)
        {
            Assembly appAssemlby = Assembly.LoadFrom(appLib);
            Type appType = providerAssemlby.GetTypes().FirstOrDefault(t => t.GetInterface(typeof(IApp).Name, true) != null && !t.IsAbstract);
            if (appType == default(Type))
            {
                continue;
            }
            try
            {
                IApp app = (IApp )Activator.CreateInstance(appType);
                initApp(app);
                this.apps.Add(app.Name, app);
            }catch(Exception ex)
            {
            }
        }
    }
}

所有程序集都引用RestSharp.dll,构建结构如下:

Debug:
DataProviderAssembly.dll
Debug/Apps:
ContractsAppAssembly.dll
AppAssembly.dll

显然,DataProviderAssembly.dll具有&#34;探测&#34; app.config文件中的选项。

调试此代码我无法访问&#34; base.OnSignRequest&#34; App类中的代码行,但是,如果我声明虚拟方法&#34; OnSignRequest&#34;在MainClassBase内部,调试器让我到达那行代码,只有当我尝试执行时才会给出异常。

0 个答案:

没有答案