C# 找不到重载方法
设置如下所示:C# 找不到重载方法,c#,visual-studio-2017,methodnotfound,C#,Visual Studio 2017,Methodnotfound,设置如下所示: .NET标准2.0库 一个针对it的NUnit测试项目,目标是.NETFramework 4.6.1 最新VS 2017,最新NUnit 周末我一直在家里做这个项目,将我的工作上传到git,今天开始工作(我以前在这两个地方都工作过)。直到现在,我才发现这个项目出了问题(我不太清楚一开始是怎么回事,但问题似乎和我现在遇到的一样,后面会描述) 在摆弄到无法修复的状态后,我完全删除了它,并重新克隆了git回购协议 项目编译精细,但在运行时测试抛出“未找到方法”异常。仔细查看一下,发
- .NET标准2.0库
- 一个针对it的NUnit测试项目,目标是.NETFramework 4.6.1
public static YNABClient GetInstance(HttpMessageHandler _handler)
{
if (instance is null)
{
instance = new YNABClient(_handler);
}
return instance;
}
public static YNABClient GetInstance() => GetInstance(new HttpClientHandler());
没有参数的是好的,有参数的不是。删除和添加库作为对测试的引用,删除和添加测试和库项目。我在互联网上找到的类似情况的其他解决方案都与ASP.NET MVC有关,但我的情况并非如此,尽管这个问题确实让我检查了重载并发现其中一个确实有效
在家里一切正常,尽管我还没有像在工作中那样尝试删除和重新安装这个项目。这导致了两个可能的问题来源:环境,尽管我没有找到有意义的区别;或者git,尽管我对VS()使用了一个“stock”git ignore,所以这里不应该有问题。我的项目的基本设置在周末没有改变,而且以前也工作过,所以最近的一些事情打破了
另外,如果我将控制台应用程序(.NETFramework 4.6.1)添加到解决方案中,并尝试从中调用有问题的方法,它实际上可以正常工作
如果这有帮助的话,我的项目github是
我被要求在评论中举例说明。基本上,我有两个具有不同设置的测试夹具类-一个用于真实API调用,以便于调试实际使用,另一个用于根据良好的测试实践伪造。
作品:
引发异常:
[OneTimeSetUp]
public void Setup()
{
handler = new StubHandler();
ynabClient = YNABClient.GetInstance(handler);
}
一些调查显示,我的问题很可能与System.Net.Http版本控制与.Net Framework和.Net标准的差异有关,如果你用谷歌搜索它,这是一个相当普遍的问题。然而,我找到的所有例子都没有显示出我的特殊症状,我也不知道该怎么办。为什么在我的家用电脑上一切正常。您遇到的问题是,您的
GetInstance
方法接受HttpMessageHandler
作为参数,并且您正在传递HttpClientHandler
对象。因此,您声明了一个参数,但在调用该方法时提供了不同的对象。我在我的环境中遇到了以下错误:
严重性代码说明项目文件行抑制状态
错误CS0433类型“HttpMessageHandler”在这两个文件中都存在
'System.Net.Http,版本=4.2.0.0,区域性=中性,
PublicKeyToken=b03f5f7f11d50a3a'和'System.Net.Http,
版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'
您的YNABConnector
是.NET标准2,但单元测试是4.6.1,它们对同一程序集使用不同的签名
以下是要测试的官方文件:
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框架和.NET标准之间的接口。问题并不是它们不兼容,或者测试项目需要一些额外的依赖项,而是它们随System.Net.Http的不同版本一起提供 由于未显示任何可见错误,诊断受到阻碍。然而,改变参数类型表明,问题只存在于该名称空间中的类 诊断该问题的另一个问题是,该项目在某些机器上运行良好(我的家用电脑和Daisy Shipton的评论) 然而,在确定了问题的根源之后,我能够用谷歌搜索出图书馆最初存在的问题,并最终在网站上发现了大量的不兼容问题 我尝试了在这些情况下使用的解决方案,并在库的具体版本中添加了“绑定重定向”,之后效果很好。我将重定向添加到我的测试项目的
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>
我仍然不明白为什么该项目在某些机器上运行良好。HttpMessageHandler是一个抽象类。HttpClientHandler是它的默认值。在测试过程中交换依赖关系需要使用另一个处理程序实例化客户机-在测试解析器时,我们不希望实际将任何内容发布到真正的服务器。虽然这是次优的实现,我可能想在未来做点什么,但现在这是我的初衷。再次阅读这个问题-方法的无参数版本实际上是有效的。好吧,现在这真的是离题了,但看看StubHandler及其在测试库中的使用,以了解为什么参数会按原样声明。摆脱过载对我来说太残酷了。他们没有理由不工作,你知道,这只是一个需要压扁的虫子。戴西·希普顿(Daisy Shipton)在对问题的评论中证明了这一点,因为一切都适合他,这是因为你的框架吗?您的YNABConnector是.NET标准2.0,但您的UnitTest是4.6.1?因为问题只在运行时出现,所以您需要在调用
GetInstance
方法的位置发布反射(或使用dyna)
<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>