我有这样的情况:
1个包含3个项目的解决方案:
嵌套库是1 Nuget包,您应该使用正确的版本为您的弹性集群。它使用内部ElasticSearch.Net库。而且,Newtonsoft.Json在这些库版本之间存在冲突。
大多数类似问题的答案都是相关的程序集重定向,但在本例中不可能实现,因为版本不兼容。
为了避免冲突,我尝试使用Fody/Costura (https://github.com/Fody/Costura)将弹性相关的dll嵌入到弹性v1和v5库中。嵌入本身工作良好,这意味着这些dll不会被复制到bin文件夹中。
我还没有尝试过ILMerge,但我的理解是它与Costura类似。
public void Test1()
{
var es1Helper = new MyElasticSearchV1RelatedProject.SearchHelper();
es1Helper.TestSearch();
var es5Helper = new MyElasticSearchV5RelatedProject.SearchHelper();
es5Helper.TestSearch();
}
public void Test2()
{
var es5Helper = new MyElasticSearchV5RelatedProject.SearchHelper();
es5Helper.TestSearch();
var es1Helper = new MyElasticSearchV1RelatedProject.SearchHelper();
es1Helper.TestSearch();
}但是Test1失败了
System.TypeLoadException:“无法从程序集'Nest、Version=1.0.0.0、Culture=neutral、PublicKeyToken=96c599bbe3e70f5d‘加载类型'Nest.Indices’。”
而Test2失败了
'Elasticsearch.Net.ConnectionPool.IConnectionPool‘System.TypeLoadException:“无法从程序集加载类型Elasticsearch.Net、Version=5.0.0.0、Culture=neutral、PublicKeyToken=96c599bbe3e70f5d”。
看起来,根据顺序,加载了其他dll版本,而另一个库项目也尝试使用它们。
有没有办法在同一个项目中使用这两个版本?
发布于 2017-07-26 18:28:09
使用一个名为C#的名为extern alias的鲜为人知的特性可能会更好。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extern-alias
这将允许您通过创建额外的根级命名空间来引用两个具有相同完全限定类型名称的DLL,以便您可以引用类型,例如:nestv1::ConnectionSettings和nestv2::ConnectionSettings。就像可以通过global::命名空间别名引用普通类型一样。
NuGet不公开这一点,因此需要手动创建引用。
发布于 2022-02-26 08:08:41
我尝试了https://www.elastic.co/blog/nest-and-elasticsearch-net-upgrading-your-codebase的解决方案。它在一个概念项目的证明中起作用:一个控制台应用程序,它引用两个库,它们依次引用Nest5.6.4和Nest.v6 (都是.NET Framework4.6.1)。
因此,我将在实际项目中尝试这种方法,在实际项目中,我们的情况与问题相似:2 elasticsearch集群,在编写本报告时都是5.6。他们将一个接一个地升级到6.8 (而不是同时)。在升级期间,迁移所有索引可能需要几个星期的时间,在此期间,我们将不得不阅读和写入elasticsearch的两个版本。本文中的解决方案看起来很容易实现,并且它不需要使用extern alias或绑定重定向或任何其他“魔术”操作。您只需引用两个不同的Nest主要版本(一个是来自nuget.org的主包,另一个是来自Elastic包提要的包),它们在一个应用程序中并排工作。
https://stackoverflow.com/questions/44831164
复制相似问题