[英]Adding Reference to Class LIbrary in Azure Function project causes assembly not found
[英]Assembly Embedded In Class Library Not Found By Main Application
我有一个C#.NET类库ClassLib
,它同时使用Newtonsoft.Json
和RestSharp
。
该库的想法是,它是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的多个副本无关,但没有一台机器上运行-它仍然失败,此错误。
不过,直到昨天还好。
因此,当然,某些地方发生了某些变化,导致了问题的产生,我只是不知道这是什么。
有任何想法吗?
好的,我知道了。
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.