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

时间:2017-06-29 17:05:02

标签: c# .net dll nest

我的情况是这样的:

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

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

Nest库是1个Nuget包,你应该为弹性簇使用正确的版本。它使用内部ElasticSearch.Net库。此外,Newtonsoft.Json在这些库版本之间存在冲突。

类似问题的大多数答案都是相关的程序集重定向,但在这种情况下,由于版本不兼容,所以不可能。

我尝试使用Fody / Costura(https://github.com/Fody/Costura)将弹性相关的dll嵌入到我的弹性v1和v5库中以避免冲突。嵌入本身工作正常意味着这些dll不会被复制到bin-folder。

我还没有尝试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.Indices'来自assembly' Nest,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 96c599bbe3e70f5d'。'

Test2失败

  

System.TypeLoadException:'无法加载类型' Elasticsearch.Net.ConnectionPool.IConnectionPool'来自assembly' Elasticsearch.Net,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 96c599bbe3e70f5d'。'

看起来根据顺序,加载了其他dll版本,其他库项目也尝试使用它们。

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

1 个答案:

答案 0 :(得分:2)

使用名为extern alias

的鲜为人知的C#功能可能会更好运

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

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

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

NuGet不公开这个,所以你需要手动创建引用。