2013-03-11 24 views
0

長的時間學習/研究後,我發現如何控制的SxS爲msvcr90d.dll/msvcp90d.dll

我的應用程序應該使用msvcr90d.dll/msvcp90d.dll - 9.0.21022.8 但是,當我調試它與VS2008,它始終使用msvcr90d.dll - 9.0.30729.6161

我認爲這應該是我的應用程序崩潰的STL標準向量異常(從第三方DLL)的根本原因。我曾使用vs2008在我的機器上成功運行應用程序。它必須是其他應用程序影響我的應用程序

我甚至重新安裝VS2008(一次又一次),並調整我的應用程序的Manifest選項,沒有任何改變。我和我的應用程序一起墜毀了。 (該應用在我準備向我的老闆演示之前就崩潰了......)

我的機器上也有vs2010,vs2012。但是這個應用程序在它們已經存在的時候曾經工作在應用程序崩潰之前我唯一能記得的就是我用TeamViewer遠程訪問我的機器......第二天,邪惡的日子開始了。

如何控制我的應用程序的SxS?

回答

1

您在您的清單中要求的DLL版本.21022.8正在重定向通過同時在並行緩存中部署的發佈者策略文件。這使你最終得到了SP1版本以及幾個安全補丁。這是Microsoft可以在運行時DLL中修補安全漏洞的主要機制。

您可以相當確定的一件事是,它是而不是導致您的問題的DLL版本,此第三方DLL要求的版本將受制於相同的版本重定向規則。易於檢查順便說一句,查看Debug + Windows +模塊窗口,並尋找msvcr90d.dll。你會看到是否有多個被加載,你可以看到版本號。注意msvcr90.dll,Release版本,它們都被加載到一個進程中是真的很糟糕。鏈接到DLL的發佈版本時可能會發生。

一個標準碰撞誘導不匹配是_HAS_ITERATOR_DEBUGGING #define。迭代器調試改變了C++集合類對象的大小。當一個DLL通過一個導出的函數公開這樣一個對象,並且爲這個#define編譯了一個不同的設置時,這會出錯。它公開的對象具有錯誤的佈局。您必須確保您使用的編譯DLL時使用的設置與第三方使用的設置相同。默認情況下,它針對Debug版本打開,因此爲項目設置#define爲0的一些可能性將成爲快速修復。如果您不知道或希望他們更改設置,請聯繫供應商。也許是指出通過DLL邊界暴露C++對象的好時機是一個壞主意。

+0

我發現msvcr80.dll和msvcr90d.dll,檢查誰是誰......這似乎是件壞事... – Raymond 2013-03-11 16:35:09

+0

我發現它是另一個第三方DLL。 – Raymond 2013-03-12 07:08:05

+0

我發現了這個錯誤,這是另一個第三方DLL的邏輯錯誤。檢查msvcr90d.dll/msvcr90.dll是一個不錯的開始。謝謝。 – Raymond 2013-03-12 07:16:26