Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 主应用程序找不到嵌入在类库中的程序集_C#_.net_Restsharp - Fatal编程技术网

C# 主应用程序找不到嵌入在类库中的程序集

C# 主应用程序找不到嵌入在类库中的程序集,c#,.net,restsharp,C#,.net,Restsharp,我有一个C#.NET类库,ClassLib,它同时使用Newtonsoft.Json和RestSharp 该库的思想是,它是一个API“超级包装器”,包含在第三方最终用户应用程序中,例如桌面应用程序、web应用程序、Windows服务等 为了保持内容的自包含性,我使用几个线程中讨论的嵌入式资源和AssemblyResolve方法将Newtonsoft和RestSharp嵌入到ClassLib中 到目前为止,一切都很平淡;我已经在不同的项目(如插件)中多次使用了这种方法,并且一切都正常工作 然而,

我有一个C#.NET类库,
ClassLib
,它同时使用
Newtonsoft.Json
RestSharp

该库的思想是,它是一个API“超级包装器”,包含在第三方最终用户应用程序中,例如桌面应用程序、web应用程序、Windows服务等

为了保持内容的自包含性,我使用几个线程中讨论的嵌入式资源和AssemblyResolve方法将Newtonsoft和RestSharp嵌入到ClassLib中

到目前为止,一切都很平淡;我已经在不同的项目(如插件)中多次使用了这种方法,并且一切都正常工作

然而,这一次,我遇到了一个奇怪的障碍。这是不一致的

我在几个小型桌面应用程序项目中使用ClassLib,这些项目演示了ClassLib的功能以及一个主要的生产项目

在演示项目中,一切都很好地工作,在生产项目中也很好地工作。但生产项目刚刚开始抛出程序集未找到错误:

无法加载文件或程序集的RestSharp,版本=100.0.0.0, 区域性=中性,PublicKeyToken=598062e77f915f75'或其 依赖项。一般异常(来自HRESULT的异常: 0x80131500)”:“RestSharp,版本=100.0.0.0,区域性=中性, PublicKeyToken=598062e77f915f75“

我试图让演示项目抛出这个错误,方法是在其他四台机器上运行ClassLib.dll,这些机器没有在我能找到的任何地方注册RestSharp,但它运行得很好

但无论我对生产项目做了什么——该项目运行在一台有多个RestSharp无关副本但我在GAC中找不到任何副本的机器上——它仍然会因为这个错误而失败

但事实是,直到昨天天气还不错

所以,当然,某些地方发生了变化,造成了这个问题,我只是不知道它是什么

相关要点:
  • ClassLib使用模糊卡进行模糊处理。情况一直如此,没有任何变化(我可以指出)
  • ClassLib、演示项目和生产项目都以.NET4.5为目标,NuGetNewtonSoft和RestSharp软件包也是如此
  • 万事如意;该错误是第一次调用API时的运行时错误
  • 如果我将RestSharp作为生产项目中的参考组件,一切都很好
  • 我已经仔细检查了各地的装配版本
  • 我已经清除了缓存,甚至在其他版本的VS中打开了该项目(我使用VS2017社区,但直到最近才使用VS2013 Pro)
  • 是的,我意识到我可以简单地将RestSharp作为一个ClassLib依赖项,但是考虑到嵌入式方法应该可以很好地工作,我不愿意这样做
  • 我也尝试过使用肋肌-据我所知,这似乎非常有效-但症状是一样的
  • 有什么想法吗?

    好的,明白了

    ClassLib和主要生产项目(“产品”)都实现(ed*)
    AssemblyResolve

        internal static Assembly GetMissingAssembly(
            object s, 
            ResolveEventArgs e)
        {
            Assembly oResult = null;
            if (!e.Name.ToLower().Contains("resources"))
            {
                string Name = e.Name; //e.Name is read-only
                if (moAssemblies != null && moAssemblies.Count > 0)
                {
                    if (moAssemblies.ContainsKey(Name)) oResult = moAssemblies[Name];
                    if (oResult == null) throw new Exception("Could not load assembly " + Name);
                }
            }
            return oResult;
        }
    
    然而,示范项目没有这样做,因为它们没有可提取的嵌入式程序集

    所以,当产品没有找到RestSharp时,它调用了
    GetMissingAssembly
    ,这是合理的,当它在程序集集合中找不到时,抛出指定的错误

    然而,如果我只是继续处理返回空结果的处理程序,那么引用最终会在ClassLib中得到解析——应该是这样的——并且一切都很好

    不管发生了什么变化,我还不知道——老实说,我可能不想费心去寻找——但解决方案是:1)不抛出错误,只返回null;2)忽略对RestSharp的任何显式搜索;或者,最好的办法是,3)检查嵌入的程序集本身是否嵌入了丢失的程序集,并在知道它将得到解决后退出

    *如前所述,我最终在ClassLib中转到了Costura,而不是自己处理
    AssemblyResolve
    。我会在产品中做同样的事情,看看这是否有效,然后发回。我希望《科斯图拉》的编剧们已经想到了这个场景,但我们拭目以待


    PS感谢教区丈夫建议我检查咬痕;我确实发现了一些需要纠正的问题,但这并不是问题所在。

    我过去曾使用中概述的程序集绑定日志查看器来调试程序集加载问题,并发现这非常有用。Bitness没有意外地改变,是吗?只是为了防止它与您的代码相关,您应该发布您尝试加载程序集的方式。您可以使用版本控制系统返回未发生异常的时间吗?然后看看这个问题开始出现时提交的更改。@Jacob我已经在自己的答案中发布了我的
    AssemblyResolve
    代码。