我的情况是这样的:
1包含3个项目的解决方案:
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版本,其他库项目也尝试使用它们。
有没有办法在同一个项目中使用这两个版本?
答案 0 :(得分:2)
使用名为extern alias
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extern-alias
这将允许您通过创建其他根级别名称空间来引用具有相同完全限定类型名称的两个DLL,以便您可以引用类型:nestv1::ConnectionSettings
和nestv2::ConnectionSettings
。就像你可以通过global::
命名空间别名引用普通类型一样。
NuGet不公开这个,所以你需要手动创建引用。