繁体   English   中英

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

[英]Assembly Embedded In Class Library Not Found By Main Application

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

该库的想法是,它是API“超级包装程序”,包含在第三方最终用户应用程序中,例如桌面应用程序,Web应用程序,Windows服务等。

为了使内容保持独立,我使用在SO上的多个线程中讨论的嵌入式资源和AssemblyResolve方法,将Newtonsoft和RestSharp嵌入到ClassLib中。

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

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

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

一切完美的示范项目,并在生产项目工作的罚款。 但是生产项目刚刚开始抛出未找到装配的错误:

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

我试图通过在其他四台未在我能找到的任何地方注册过RestSharp的机器上运行ClassLib.dll来运行该演示项目,以引发此错误,该示例运行良好。

但无论我做什么与生产项目-这是那里在GAC,我可以找到RestSharp的多个副本无关,但没有一台机器上运行-它仍然失败,此错误。

不过,直到昨天还好。

因此,当然,某些地方发生了某些变化,导致了问题的产生,我只是不知道这是什么。

相关要点:

  1. 使用Obfuscar对ClassLib进行混淆。 情况一直如此,我(我无法指出)没有任何变化。
  2. ClassLib,演示项目和生产项目都以.NET 4.5为目标,NuGet Newtonsoft和RestSharp软件包也是如此。
  3. 一切都建立良好; 错误是在首次调用该API时的运行时。
  4. 如果我将RestSharp包含在生产项目中作为参考程序集,一切都很好。
  5. 我已经到处仔细检查了组装版本。
  6. 我已经清除了缓存,甚至在其他版本的VS中打开了项目(我使用VS2017社区,但直到最近才使用VS 2013 Pro)。
  7. 是的,我意识到我可以简单地将RestSharp包含为ClassLib依赖项,但是鉴于嵌入式方法应该可以正常工作,因此我不愿意这样做。
  8. 我还尝试过使用Costura-就我所知,它似乎工作得很好-但症状是相同的。

有任何想法吗?

好的,我知道了。

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;
    }

但是,演示项目没有,因为它们没有要提取的嵌入式程序集。

因此,发生的事情是,当Product找不到RestSharp时,它足够合理地调用了GetMissingAssembly ,并且在程序集集合中未找到它时,抛出了指定的错误。

但是,如果我只是继续通过处理程序返回空结果,则该引用最终将在ClassLib中解析-应当如此-一切都很好。

无论发生什么变化,我都不知道-坦白地说,我可能不会打扰-但解决方案是:1)不要抛出错误并仅返回null,2)忽略对RestSharp的任何搜索,或者,可能是最好的方法,3)检查嵌入式程序集本身是否嵌入了丢失的程序集,然后退出,知道它将得到解决。

*如前所述,我最终使用ClassLib移至Costura,而不是亲自处理AssemblyResolve 我将在“产品”中执行相同的操作,看看是否可行,然后回发。 我希望Costura的作者想到了这种情况,但我们会看到的。

PS:感谢教区丈夫建议我检查一下咬伤; 我确实找到了一些需要纠正的问题,尽管这不是问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM