我有一个Net 4.6.2控制台应用程序,它使用我编写的Net Standard 2.0库。库中的一个方法返回一个元组:
public (ScanStatEntry scanEntry, DateTime nextScan) Run()
{
从控制台应用程序中调用例程,如下所示:
(ScanStatEntry scanEntry, DateTime nextScan) = _scanner.Run();
这一切都运行良好很长一段时间......直到我突然在控制台应用程序运行时开始出现以下异常:
System.MissingMethodException:找不到方法: '&System.ValueTuple`2 LT; Olbert.CommunityScanner.Data.Entities.ScanStatEntry,System.DateTime的> Olbert.CommunityScanner.Scanner.Run()&#39 ;.在 Olbert.CommunityScanner.ScannerService.RunAndWait()at Olbert.CommunityScanner.ScannerService.Start()in C:\程序\ CommunityScanner \ CommunityScannerTopShelf \ ScannerService.cs:行 70点到 Olbert.CommunityScanner.Program。<> c.b__0_2(ScannerService tc)in C:\程序\ CommunityScanner \ CommunityScannerTopShelf \的Program.cs:行 20点到 Topshelf.ServiceConfiguratorExtensions<> c__DisplayClass2_0`1< WhenStarted> b__0(T 服务,HostControl控制)在 Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)在Topshelf.Hosts.ConsoleRunHost.Run()
我不知道我做了什么导致出现此问题。此外,一切都编译好,没有错误;只要执行尝试输入_scanner.Run()
调用所在的方法(例如,包含类'构造函数执行得很好),它就会崩溃。
在研究这个时,我意识到我从未在控制台应用程序中安装System.ValueTuple
NuGet包...我认为在Net 4.6.2中使用元组时我认为这是必需的,但如果是这样的话,我不知道为什么应用程序运行良好。
所以我尝试添加包。没有快乐;同样编译没关系,但执行崩溃声称无法找到该方法。
在同一个Net Standard 2.0库中调用另一个方法可以正常工作。它只是返回导致问题的元组的方法。我可以通过返回一个对象而不是一个元组来解决这个问题,但我很好奇是什么导致了这个问题,以及为什么它在一切正常工作之后出现了。
答案 0 :(得分:2)
在线研究这个问题还有几个小时让我讨论了与自动绑定重定向相关的问题。显然,当您混合使用净标准和净传统组件时会出现这些情况,这些组件本身依赖于可能依赖于其他组件的不同版本的其他组件。
在我的net传统控制台应用程序中,自动重定向设置在csproj文件中(旧样式格式,第一个PropertyGroup):
class MyList(object):
def __init__(self, init_values):
self.myList = []
self.myList.extend(init_values)
def append(self, value):
self.myList.append(value)
def __getitem__(self, _slice):
return self.myList[_slice]
将AutoGeneratedBindingRedirects设置为false可以解决应用程序崩溃的问题,让我进入返回元组的Net Standard类库方法。
答案 1 :(得分:0)
我知道这是一个迟到的答案,但是如果有人仍然遇到这个问题并通过这个线程来,我们通过向 .net-standard 项目的 csproj 文件添加多个框架目标来解决它。
这样编译器会为每个框架编译一个版本并链接正确的版本。
<PropertyGroup>
<TargetFrameworks>net472;net5.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
PS:注意它是 TargetFrameworkS,复数。