。net标准端口库在.net核心和.net框架中的行为有所不同

问题描述 投票:4回答:1

我们必须使用第三方供应商(perforce)的api。直到今天,我们已经能够在.net Framework应用程序中引用和使用该API。但是,现在我们正在重构产品,当然我们决定使用新的.net环境,即.net core 2.2。由于Perforce没有为.net核心发布该库,因此我们决定将该库移植到.net标准。

因此,简而言之,我们下载了源代码,进行了移植,并添加为.net核心项目中的参考。

到目前为止,很好。奇怪的是,在对该库进行了一些使用之后,我们从该库中获取了ExecutionEngineException,这会触发ExecutionEngineException并终止应用程序。

一个更重要的信息是该库使用了另一个本机库(p4bridge.dll)。

例外是这样:

Environment.Failfast

我已经知道与FailFast: A callback was made on a garbage collected delegate of type 'p4netapi!Perforce.P4.P4CallBacks+LogMessageDelegate::Invoke'. at Perforce.P4.P4Bridge.RunCommandW(IntPtr, System.String, UInt32, Boolean, IntPtr[], Int32) at Perforce.P4.P4Bridge.RunCommandW(IntPtr, System.String, UInt32, Boolean, IntPtr[], Int32) at Perforce.P4.P4Server.RunCommand(System.String, UInt32, Boolean, System.String[], Int32) at Perforce.P4.P4Command.RunInt(Perforce.P4.StringList) at Perforce.P4.P4CommandResult..ctor(Perforce.P4.P4Command, Perforce.P4.StringList) at Perforce.P4.P4Command.Run(Perforce.P4.StringList) at Perforce.P4.Client.runFileListCmd(System.String, Perforce.P4.Options, System.String, Perforce.P4.FileSpec[]) at Perforce.P4.Client.SyncFiles(System.Collections.Generic.IList`1<Perforce.P4.FileSpec>, Perforce.P4.Options) 相关的消息。似乎在某个地方,将指向委托的指针传递给非托管库,然后GC收集了它。

我们看一下该api的源代码。我们看到了一些可能的地方,这可能是导致该错误的原因。但是,这只是一个想法。

[调查故障时,我们创建了另一个引用该移植库的.net框架应用程序,并且那时我们在.net框架中没有遇到任何错误。] >>

我的问题是:

  1. 。net框架和.net核心之间在垃圾回收器机制方面是否有任何区别
  2. 。net框架和.net核心如何以不同的方式对同一个库做出反应?

我们必须使用第三方供应商(perforce)的api。直到今天,我们已经能够在.net Framework应用程序中引用和使用该API。但是,现在我们正在重构我们的产品,当然,我们...

c# .net .net-core garbage-collection .net-standard
1个回答
0
投票

我已经解决了该问题,因此我想发布对问题的答案。当您现在阅读我的答案时,这意味着您遇到了类似的问题。首先,我要感谢garbage collected delegate的评论,并建议您阅读这些评论。

© www.soinside.com 2019 - 2024. All rights reserved.