Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找不到重载方法_C#_Visual Studio 2017_Methodnotfound - Fatal编程技术网

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
最新VS 2017,最新NUnit

周末我一直在家里做这个项目,将我的工作上传到git,今天开始工作(我以前在这两个地方都工作过)。直到现在,我才发现这个项目出了问题(我不太清楚一开始是怎么回事,但问题似乎和我现在遇到的一样,后面会描述)

在摆弄到无法修复的状态后,我完全删除了它,并重新克隆了git回购协议

项目编译精细,但在运行时测试抛出“未找到方法”异常。仔细查看一下,发现问题只出现在以下方法的一个重载上:

    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,它们对同一程序集使用不同的签名

以下是要测试的官方文件:

  • 创建了一个.NET核心库(请注意:不能通过上述链接成为.NET标准库)
  • 复制你的测试代码
  • 按照官方文件添加参考资料
  • 您的代码可以正常工作,没有错误

    但在您的基本代码中,我仍然更喜欢以下代码:

    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>