在VisualStudio2017测试运行程序中,项目引用的运行时问题似乎是。单元测试CSPROJ使用TargetFramework=net47
构建得很好,但是在执行时我们从MSTEST或XUNIT获得以下消息。使用Microsoft.NET.Test.Sdk
v15.0.0。
测试执行错误(x86):Serilog扩展
未找到的方法:‘Serilog.SeqLoggerConfigurationExtensions.Seq(Serilog.Configuration.LoggerSinkConfiguration,System.MissingMethodException System.String,Serilog.Events.LogEventLevel,Int32,System.Nullable
1<System.TimeSpan>, System.String, System.String, System.Nullable
1,System.Nullable1<Int64>, Serilog.Core.LoggingLevelSwitch, System.Net.Http.HttpMessageHandler, System.Nullable
1,布尔,Int32’。
单元测试示例- Serilog
[Fact]
public void TestMethod1()
{
LoggerConfiguration loggerConfig = new LoggerConfiguration();
loggerConfig.MinimumLevel.Debug();
loggerConfig.WriteTo.LiterateConsole();
loggerConfig.WriteTo.Seq("http://localhost:65454");
}
如果我们参考net462
项目,我们会得到相同的结果,因此我们认为它与VS 2017相关,而不是.NET框架版本。在VS 2015中,我们从未见过这样的错误。似乎存在一个问题:加载带有可选参数/匹配签名的DLL扩展,等等。该方法显然存在,否则它不会编译--为什么在运行时这个方法会崩溃呢?
如果我只使用本地nuget包,它就能正常工作--在.NET CSPROJ中通过.NET引用任何项目时,这似乎只是一个问题。它似乎没有正确地处理依赖树。
另一个使用KeyVault
的示例,其中VS测试运行程序无法正确找到扩展方法.
测试执行错误(x86):KeyVault扩展
消息: System.MissingMethodException :方法未找到:'Void Microsoft.Azure.KeyVault.KeyVaultClient..ctor(AuthenticationCallback,System.Net.Http.DelegatingHandler[])‘。
单元测试示例- KeyVault
[Fact]
public void TestMethod1()
{
KeyVaultClient _kvClient = new KeyVaultClient(new AuthenticationCallback(getKeyVaultToken));
}
private static async Task<string> getKeyVaultToken(string authority, string resource, string scope)
{
var authContext = new AuthenticationContext(authority);
ClientCredential clientCred = new ClientCredential("test", "account");
AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCred).Result;
if (result == null)
throw new InvalidOperationException("Failed to obtain the JWT token");
return result.AccessToken;
}
发布于 2017-05-09 16:12:18
在dotnet test
中发现这个奇怪的问题是双重的。在运行了dotnet test --diag
并检查了输出之后,我意识到Microsoft.NET.Test.Sdk
的15.0.0
版本掩盖了真正的问题。一旦我将nuget升级到15.3.0-preview-20170502-03
,就出现了另一个例外。
错误来源: Microsoft.Rest.ClientRuntime
System.TypeLoadException:‘继承安全规则违反类型:'System.Net.Http.WebRequestHandler’。派生类型必须与基本类型的安全可访问性相匹配,否则不可访问性较低。
这很有趣-- MissingMethodException
掩盖了隐藏在System.Net.Http
中的真正问题。第二个认识是这个基库有一个错误,无法加载该类型。。一旦我4.3.1
,问题就消失了,我的项目引用又开始工作了。
结论
更新到最新预览和到最新版本,使用dotnet测试通过奇怪的MissingMethodException
。你可以在这里跟踪github上的公开问题。
备选方案2-不包括包参考资产
对于最新的VS 2017 CSPROJ
格式,下面的配置也修正了这一点,因为它阻止将System.Net.Http
复制到构建输出路径,默认情况下该路径加载GAC的版本4.0.0.0
。
<PackageReference Include="System.Net.Http" Version="4.3.1">
<ExcludeAssets>All</ExcludeAssets>
</PackageReference>
选项3-程序集绑定重定向
dotnet
核心将遵循您在app.config
中放置的任何运行时绑定重定向,因此您必须将System.Net.Http
的任何nuget依赖项重定向到version 4.1.*
,您可以重定向到最新版本或恢复到上一个稳定版本4.0
。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- Another PackageReference dependency binds to 4.1.1 which is busted, we leverage .NET Core redirection and revert to CLR 4.0.0 -->
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
发布于 2021-03-23 15:19:51
I在测试一个依赖于正在测试的项目中更新的Nuget包的项目中的类时遇到了这个问题,但在测试项目中(它是缺少的方法的来源)。
解决方案非常简单,只需在测试项目中升级受影响的Nuget:
Right-Click the test project > Manage Nuget packages > Upgrade necessary packages
发布于 2021-12-22 19:32:58
我正在做一个SharePoint插件,插件已经安装在服务器上,我也在使用它来进行开发。因此,我认为DLL是在GAC中,而这个DLL是首先被捡起来的!
我是从测试跑步者那里得到MissingMethodException的。所以我想出了一个简单的解决办法。
更改AssemblyInfo.cs!中的版本号--这将使GAC中的版本号与bin/目录中的版本号有所不同,因此测试运行程序将使用正确的DLL。呼!
另请参阅:
https://stackoverflow.com/questions/43873978
复制相似问题