Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态DLL加载参考问题_C#_.net_Dynamic_.net Assembly_Restsharp - Fatal编程技术网

C# 动态DLL加载参考问题

C# 动态DLL加载参考问题,c#,.net,dynamic,.net-assembly,restsharp,C#,.net,Dynamic,.net Assembly,Restsharp,动态加载具有共享引用的库时,我面临一个问题。我知道问题出在哪里,但我真的不知道如何解决它 我将努力更好地解释我的问题,这是我的结构: 我有3个组件 DataProviderAssembly 合同装配 骇人听闻 我开始说我现在不能使用MEF “DataProviderAssembly”以友好方式加载“AppAssembly”,因为它的类型实现了“ContractsAssembly”中的IApp接口。 按照下面的代码,当我尝试从App类调用OnSignRequest方法时,我得到一个Missin

动态加载具有共享引用的库时,我面临一个问题。我知道问题出在哪里,但我真的不知道如何解决它

我将努力更好地解释我的问题,这是我的结构:

我有3个组件

  • DataProviderAssembly
  • 合同装配
  • 骇人听闻
我开始说我现在不能使用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)
            {
            }
        }
    }
}
显然,DataProviderAssembly.dll在app.config文件中有“探测”选项


调试此代码时,我无法访问App类中的“base.OnSignRequest”代码行,但是,如果我在MainClassBase中声明虚拟方法“OnSignRequest”,调试器只在我尝试执行一步操作时才允许我访问给出异常的那行代码。

我刚刚发现问题是由生成文件夹结构引起的。如果我在同一个文件夹中构建所有内容,则不会出现错误。但在我看来这很奇怪,数据提供者只引用合同组件。AppAssembly仅引用合同部件。DataProvider和AppAssembly位于两个不同的文件夹中。可能是他们试图使用两个不同的RestSharp.dll?我刚刚发现问题是由构建文件夹结构引起的。如果我在同一个文件夹中构建所有内容,则不会出现错误。但在我看来这很奇怪,数据提供者只引用合同组件。AppAssembly仅引用合同部件。DataProvider和AppAssembly位于两个不同的文件夹中。可能是他们试图使用两个不同的RestSharp.dll?
Debug:
DataProviderAssembly.dll
Debug/Apps:
ContractsAppAssembly.dll
AppAssembly.dll