2010-11-29 41 views
0

我們有一個本地庫,我們用它來爲我們執行安全相關的任務。我們編寫了一個互操作庫,以便我們可以從.NET使用它。爲什麼從.net調用的本地代碼從本地程序調用它會給出不同的結果?

我們有兩個測試應用程序,第一個應用程序是用C++編寫的(非託管的),第二個應用程序是用C#編寫的。它們會生成與本地庫完全相同的調用序列,但會產生不同的結果。

我迷路了,在.NET導入定義中找不到任何明顯的錯誤。我已經把它弄糟了,所以我只用一個非常簡單的界面來工作。我在尋找爲什麼從.NET環境調用本地庫可能會影響結果的想法。

編輯: 我沒有深入的圖書館知識,所以我不能提供很多有關在本地代碼中完成的工作。我知道它確實保持了(熱感)線程。用於識別應用程序是否在虛擬機上運行的庫的另一部分也具有相同的行爲。這不一定相關。

我在C++/CLI中編寫了另一個測試應用程序,因爲使用本地庫比C#更容易一些,它也提供了與C#相同的結果。

+5

我認爲這裏需要更多infomartion。你做什麼,你怎麼做? =) – Jens 2010-11-29 13:45:22

+0

原生庫不太可能是不同結果的來源。機會是,差異在於測試應用程序。 – 2010-11-29 13:47:22

+0

這可能有許多不同的原因。你能提供更多細節嗎? – 2010-11-29 13:47:31

回答

2

瘋狂的猜測:你將函數編號爲bool的函數編號爲bool。由於bool不能編組到bool

1

當從本地代碼和託管代碼調用時,會給出不同的結果,如果本機庫使用本地線程本地存儲,則可能會出現這種情況。託管線程和本地線程之間沒有(必然)一對一映射。

爲了消除這種可能性,您可以嘗試在調用BeginThreadAffinity/EndThreadAffinity的過程中打包整個調用序列(也就是說,跨所有調用進入庫中的一對調用,而不是每個調用周圍的一對調用進庫)

0

關鍵詞:

我們寫了一個互操作庫,這樣我們可以從.NET中使用它(本地庫)。

這是您的錯誤的來源,而不是本機庫。特定的本地調用(特定函數調用w /特定參數)將返回相同的結果,無論調用方式如何。這個問題變成了你的包裝可以引入微妙的錯誤,你可以「認爲」你正在進行相同的調用,但互操作版本正在做出稍微不同的調用(因此結果不同)。

我會從最低級別的互操作庫的一些非常好的單元測試開始。本地函數foo(int x,int y)。本地調用它,通過庫調用它。結果應該是一樣的。繼續下去,直到找到不在的函數調用。 如果有問題,請與您的編組&互操作,而不是本機庫。如果您發現返回差異結果的單個電話,並且您無法在互操作中找到錯誤的來源,則在SO上發出單個電話作爲問題。

0

這可能是一個編組/ interop問題,正如其他人所建議的。

但也可能是本地庫正在對其環境進行假設,而這些假設並不僅僅表示在呼叫簽名中。

有很多方法可以做出這樣的假設。作爲一個隨機的例子,MFC庫中的一個不調用AFX_MANAGE_STATE宏的方法可能會做出從.NET代碼調用時無效的假設。

相關問題