2010-05-12 101 views
3

我有一些第三方DLL的这个奇怪的问题。第三方提供者引用一些开源DLL,每当我尝试使用某种方法时,都会出现内存异常。当应用程序在单个核心机器上运行时,不会出现此问题,但显然我们不能假定用户会拥有该问题。强制应用程序只运行单核?

有没有办法强制一个应用程序,或甚至更好的引用DLL运行在单个核心上?任何其他方式可能解决这个问题?让第三方重建操作系统的DLL显然是不可能的(它对我来说有点痛苦:)),所以我必须自己处理它,或者忘记提供这个功能。

顺便说一句,从操作系统DLL的引发的错误消息是“试图访问损坏或受保护的内存”。

+0

您正在寻找的神奇词是'处理器亲和力'或'线程亲和力'。 – mquander 2010-05-12 22:06:20

+0

http://stackoverflow.com/questions/628057/how-to-set-processor-affinity-on-an-executable-in-windows-xp可能有帮助 – 2010-05-12 22:08:42

回答

4

你想要做的是通过使用Process.ProcessorAffinity来实现。请注意,这将使您的整个应用程序运行单核。

编辑:你的问题可能是DLL期待有单处理器亲和力的结果,但它也可以是一个线程问题(如比赛条件),这是非常不可能发生的,当你只有一个核心。如果最后一个是真的,除了交叉手指和祈祷之外,你不能做任何事情(也可以考虑放弃功能来保持应用程序的稳定)。

+1

要设置这个单线程,你需要P /调用SetThreadAffinityMask http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx。但是这依赖于.NET线程与Win32线程严格联系的假设,该线程目前属实,但未定义为始终为真。 – Richard 2010-05-12 22:12:51

+0

注意到处理器关联存在安全问题也很重要。我在代码中需要做的事情很少,这导致我去追查权限问题,但这是其中之一。 – Toby 2010-05-12 22:16:51

+0

我真的不敢相信,但这显然已经解决了这个问题。在100%的时间里,我可以在0%的时间内崩溃。这显然远不是“稳定”,但它是一个开始。而这个特殊的功能仅仅是一些渴望拥有这一功能的客户所要求的,并且如果需要的话愿意为我测试它。谢谢。 – Kevin 2010-05-12 22:24:51

1

就我个人而言,我会放弃该功能(您说这是一个选项)。多线程是一个非常敏感的主题,很明显第三方DLL编写得不好。

你说这个问题没有出现,如果你在单核上运行它,但没有看到问题并不意味着你没有问题(并且线程问题只是很少见到),所以机会是你的产品每隔一段时间就可能因此而失败。

+0

我没有问题。 – Blindy 2016-05-04 18:01:21

0

我曾经在引用32位的DLL但.NET应用程序构建为64位时遇到了一些奇怪的问题。既然你提到它不会发生在单核机器上,我假设它们是32位的,而多核机器是64位的?

唯一的区别是我得到一个BadImageFormatException,你没有提到。无论如何,我解决这个问题的方式是将我的应用程序的“平台目标”设置为x86,并在此之后进行工作。

相关问题