找不到重载方法
Overloaded method not found
设置如下:
- .NET Standard 2.0 库
- 它的一个 NUnit 测试项目,目标是 .NETFramework 4.6.1
最新 VS 2017,最新 NUnit。
周末我一直在家里处理这个项目,将我的工作上传到 git,今天开始工作(我之前已经在这两个地方工作过)。现在才发现项目有问题(一开始是什么问题我不太记得了,不过好像和我现在的问题是一样的,后面再说)。
在摆弄到无法修复的状态后,我将其完全删除并重新克隆了 git 存储库。
项目编译正常,但在运行时 测试抛出"Method not found" 异常。稍微查了一下发现问题只出现在以下方法的一个重载上:
public static YNABClient GetInstance(HttpMessageHandler _handler)
{
if (instance is null)
{
instance = new YNABClient(_handler);
}
return instance;
}
public static YNABClient GetInstance() => GetInstance(new HttpClientHandler());
没有参数的可以,有参数的不行。删除和添加库作为测试的参考,删除和添加测试和库项目。我在 Internet 上找到的针对类似情况的其他解决方案都属于 ASP.NET MVC,这不是我的情况,尽管 this 问题确实让我检查了重载并发现其中一个确实有效。
虽然我还没有像在工作中那样尝试删除并重新安装该项目,但在家里一切仍然正常。这导致了 2 个可能的问题来源:环境,尽管我还没有找到有意义的差异,或者 git,尽管我使用 "stock" git 忽略 VS(this one), 所以那里不应该有问题。我的项目的基本设置在周末没有改变并且以前工作过,所以最近的摆弄导致了一些问题。
此外,如果我将控制台应用程序 (.Net Framework 4.6.1) 添加到解决方案并尝试从中调用有问题的方法,它实际上工作正常。
如果有帮助,我的 git 项目中心是 here
有人要求我在评论中调用示例。基本上,我有 2 个具有不同设置的测试夹具 类 - 一个用于真正的 API 调用以方便调试实际使用,另一个根据良好的测试实践进行伪造。
作品:
[OneTimeSetUp]
public void Setup()
{
ynabClient = YNABClient.GetInstance();
ynabClient.RefreshAccessToken(ApiKeys.AccessToken);
}
抛出异常:
[OneTimeSetUp]
public void Setup()
{
handler = new StubHandler();
ynabClient = YNABClient.GetInstance(handler);
}
一些调查表明我的问题很可能与 .NET Framework 和 .NET Standard 的 System.Net.Http 版本控制差异有关,如果你 google 它是一个相当普遍的问题。然而 none 我挖出的例子表现出我的特殊症状,我还不确定该怎么做。以及为什么在我的家用电脑上一切正常。
您遇到的问题是您的 GetInstance
方法接受 HttpMessageHandler
作为参数,而在您的 test 中您传递的是 HttpClientHandler
对象。因此,您声明了一个参数,但在调用该方法时提供了不同的对象。
我在我的环境中遇到这个错误:
Severity Code Description Project File Line Suppression State
Error CS0433 The type 'HttpMessageHandler' exists in both
'System.Net.Http, Version=4.2.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' and 'System.Net.Http,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
您的 YNABConnector
是 .NET Standard 2,但单元测试是 4.6.1,它们对同一程序集使用不同的签名。
官方文档供测试:
https://github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard
- 创建了一个 .NET Core 库(注意:上面 link 不能是 .NET Standard 库),
- 在那里复制你的测试代码,
- 按照官方文档添加引用,
你的代码可以正常工作,没有错误。
但是在你的基本代码中,我还是更喜欢这个代码:
public class YNABClient
{
private static YNABClient instance;
private HttpClient client;
private HttpMessageHandler handler;
private YNABClient(HttpMessageHandler _handler = null)
{
handler = _handler ?? new HttpClientHandler();
client = new HttpClient(_handler);
}
public static YNABClient GetInstance(HttpMessageHandler _handler = null)
{
return instance ?? (instance = new YNABClient(_handler));
}
......
}
所以,事实证明,正如冬冬所说,问题确实出在 .NET Framework 和 .NET Standard 之间的接口上。问题不在于它们不兼容,或者测试项目需要一些额外的依赖项,而是它们随不同版本的 System.Net.Http.
一起提供
诊断因未显示可见错误而受阻。但是,更改参数类型表明,确实,问题仅出在该名称空间中的 类。
诊断问题的另一个问题是该项目在某些机器上运行良好(我的家用 PC 和 Daisy Shipton 对问题的评论)。
然而,在确定问题的根源后,我能够 google 首先发现库存在哪些问题,并最终在 .NET github 上发现了一大堆不兼容问题。
我尝试了在这些情况下使用的解决方案,并在库的具体版本中添加了 "binding redirect",之后它工作正常。我将重定向添加到我的测试项目的 app.config
。作为参考,它看起来像这样:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
我仍然不明白为什么该项目在某些机器上运行良好。
设置如下:
- .NET Standard 2.0 库
- 它的一个 NUnit 测试项目,目标是 .NETFramework 4.6.1
最新 VS 2017,最新 NUnit。
周末我一直在家里处理这个项目,将我的工作上传到 git,今天开始工作(我之前已经在这两个地方工作过)。现在才发现项目有问题(一开始是什么问题我不太记得了,不过好像和我现在的问题是一样的,后面再说)。
在摆弄到无法修复的状态后,我将其完全删除并重新克隆了 git 存储库。
项目编译正常,但在运行时 测试抛出"Method not found" 异常。稍微查了一下发现问题只出现在以下方法的一个重载上:
public static YNABClient GetInstance(HttpMessageHandler _handler)
{
if (instance is null)
{
instance = new YNABClient(_handler);
}
return instance;
}
public static YNABClient GetInstance() => GetInstance(new HttpClientHandler());
没有参数的可以,有参数的不行。删除和添加库作为测试的参考,删除和添加测试和库项目。我在 Internet 上找到的针对类似情况的其他解决方案都属于 ASP.NET MVC,这不是我的情况,尽管 this 问题确实让我检查了重载并发现其中一个确实有效。
虽然我还没有像在工作中那样尝试删除并重新安装该项目,但在家里一切仍然正常。这导致了 2 个可能的问题来源:环境,尽管我还没有找到有意义的差异,或者 git,尽管我使用 "stock" git 忽略 VS(this one), 所以那里不应该有问题。我的项目的基本设置在周末没有改变并且以前工作过,所以最近的摆弄导致了一些问题。
此外,如果我将控制台应用程序 (.Net Framework 4.6.1) 添加到解决方案并尝试从中调用有问题的方法,它实际上工作正常。
如果有帮助,我的 git 项目中心是 here
有人要求我在评论中调用示例。基本上,我有 2 个具有不同设置的测试夹具 类 - 一个用于真正的 API 调用以方便调试实际使用,另一个根据良好的测试实践进行伪造。 作品:
[OneTimeSetUp]
public void Setup()
{
ynabClient = YNABClient.GetInstance();
ynabClient.RefreshAccessToken(ApiKeys.AccessToken);
}
抛出异常:
[OneTimeSetUp]
public void Setup()
{
handler = new StubHandler();
ynabClient = YNABClient.GetInstance(handler);
}
一些调查表明我的问题很可能与 .NET Framework 和 .NET Standard 的 System.Net.Http 版本控制差异有关,如果你 google 它是一个相当普遍的问题。然而 none 我挖出的例子表现出我的特殊症状,我还不确定该怎么做。以及为什么在我的家用电脑上一切正常。
您遇到的问题是您的 GetInstance
方法接受 HttpMessageHandler
作为参数,而在您的 test 中您传递的是 HttpClientHandler
对象。因此,您声明了一个参数,但在调用该方法时提供了不同的对象。
我在我的环境中遇到这个错误:
Severity Code Description Project File Line Suppression State Error CS0433 The type 'HttpMessageHandler' exists in both 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
您的 YNABConnector
是 .NET Standard 2,但单元测试是 4.6.1,它们对同一程序集使用不同的签名。
官方文档供测试: https://github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard
- 创建了一个 .NET Core 库(注意:上面 link 不能是 .NET Standard 库),
- 在那里复制你的测试代码,
- 按照官方文档添加引用,
你的代码可以正常工作,没有错误。
但是在你的基本代码中,我还是更喜欢这个代码:
public class YNABClient
{
private static YNABClient instance;
private HttpClient client;
private HttpMessageHandler handler;
private YNABClient(HttpMessageHandler _handler = null)
{
handler = _handler ?? new HttpClientHandler();
client = new HttpClient(_handler);
}
public static YNABClient GetInstance(HttpMessageHandler _handler = null)
{
return instance ?? (instance = new YNABClient(_handler));
}
......
}
所以,事实证明,正如冬冬所说,问题确实出在 .NET Framework 和 .NET Standard 之间的接口上。问题不在于它们不兼容,或者测试项目需要一些额外的依赖项,而是它们随不同版本的 System.Net.Http.
一起提供诊断因未显示可见错误而受阻。但是,更改参数类型表明,确实,问题仅出在该名称空间中的 类。
诊断问题的另一个问题是该项目在某些机器上运行良好(我的家用 PC 和 Daisy Shipton 对问题的评论)。
然而,在确定问题的根源后,我能够 google 首先发现库存在哪些问题,并最终在 .NET github 上发现了一大堆不兼容问题。
我尝试了在这些情况下使用的解决方案,并在库的具体版本中添加了 "binding redirect",之后它工作正常。我将重定向添加到我的测试项目的 app.config
。作为参考,它看起来像这样:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
我仍然不明白为什么该项目在某些机器上运行良好。