首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#使用同一个库的多个版本(nest)

c#使用同一个库的多个版本(nest)
EN

Stack Overflow用户
提问于 2017-06-29 17:05:02
回答 2查看 1.1K关注 0票数 4

我有这样的情况:

1个包含3个项目的解决方案:

  • 1控制台应用程序,它引用这两个其他弹性相关项目。
  • 1弹性搜索v1项目,它包含Nest和ElasticSearch.Net v1库,用于搜索旧的弹性1.4集群
  • 1弹性搜索v5项目,其中包含Nest和ElasticSearch.Net v5库,用于搜索我们新的弹性5.4集群

嵌套库是1 Nuget包,您应该使用正确的版本为您的弹性集群。它使用内部ElasticSearch.Net库。而且,Newtonsoft.Json在这些库版本之间存在冲突。

大多数类似问题的答案都是相关的程序集重定向,但在本例中不可能实现,因为版本不兼容。

为了避免冲突,我尝试使用Fody/Costura (https://github.com/Fody/Costura)将弹性相关的dll嵌入到弹性v1和v5库中。嵌入本身工作良好,这意味着这些dll不会被复制到bin文件夹中。

我还没有尝试过ILMerge,但我的理解是它与Costura类似。

代码语言:javascript
复制
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版本,而另一个库项目也尝试使用它们。

有没有办法在同一个项目中使用这两个版本?

EN

回答 2

Stack Overflow用户

发布于 2017-07-26 18:28:09

使用一个名为C#的名为extern alias的鲜为人知的特性可能会更好。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extern-alias

这将允许您通过创建额外的根级命名空间来引用两个具有相同完全限定类型名称的DLL,以便您可以引用类型,例如:nestv1::ConnectionSettingsnestv2::ConnectionSettings。就像可以通过global::命名空间别名引用普通类型一样。

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/namespaces/how-to-use-the-global-namespace-alias

NuGet不公开这一点,因此需要手动创建引用。

票数 2
EN

Stack Overflow用户

发布于 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包提要的包),它们在一个应用程序中并排工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44831164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档