我有一个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来运行该演示项目,以引发此错误。
但是无论我如何处理生产项目-运行在有 个多余的RestSharp副本但在我无法找到的GAC中的机器上,它都会继续失败这个错误。
尽管如此,直到昨天还好。
因此,当然,某些地方发生了某些变化,导致了问题的产生,我只是不知道这是什么。
有什么想法吗?
答案 0 :(得分:0)
好,知道了。
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:感谢教区丈夫建议我检查咬伤;我确实找到了一些需要纠正的问题,尽管这不是问题。