我有一個關於p/invoke從託管到非託管代碼的問題。請參閱我的原始post at the MSDN forum(稍後會在本文中看到簡要概述)。在我繼續之前,我只想解釋幾件事情:我在net 3.5中有一個包裝程序集,它將實際的interop轉換爲非託管代碼。然後我有我的控制檯「主機應用程序」,它使用包裝程序集。pInvoke,.net 4 vs 3.5
我提出的解決方案(我指的是我的MSDN文章)在主機應用程序使用.net 4時有效,但在將主機應用程序更改爲使用.net 3.5時不起作用。當改變時,我得到一個AccessViolationException。
- 主機應用程序:4.0,包裝程序:3.5 - >工作
- 主機應用程序:3.5,包裝程序:3.5 - >拋出 AccessViolationException
做任何人有一個線索,爲什麼我得到一個AccessViolationException?最重要的是,我如何才能使用.net 3.5?
我參考的MSDN帖子小結。我有這個混亂的p/Invoke我需要解決。 C聲明如下所示:
long TBAPI TbeAndring (short,
short,
PTB_PU,
PTB_ANDRING_INFO,
PTB_PARAMS,
PTB_PREMIE_NIVA_INFO,
PTB_PREMIE,
PTB_FORMAN_INFO,
PTB_FORMAN,
PTB_FUNK,
PTB_PARAMS,
PTB_PREMIE_NIVA_INFO,
PTB_PREMIE,
PTB_FORMAN_INFO,
PTB_FORMAN,
PTB_FUNK);
其中PTB表示每個參數都是指向任意長度數組的結構指針。結構大多包含字符串,雙打,字符和短。反正,我結束了這個聲明的DllImport:
<DllImport(NativeLibraryName, CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi, SetLastError:=True)>
Public Shared Function TbeAndring(ByVal sAntMoment As Short, _
ByVal sAntPU As Short, _
<[In]()> ByVal atbpu As PTB_PU(), _
<[In]()> ByVal atbandringinfo() As PTB_ANDRING_INFO, _
<[In]()> ByVal atbparamsEfter() As PTB_PARAMS, _
<[In]()> ByVal aNivaInfoEfter() As PTB_PREMIE_NIVA_INFO, _
<[In](), Out()> ByVal atbpremieEfter() As PTB_PREMIE, _
<[In]()> ByVal atbFormanInfoEfter() As PTB_FORMAN_INFO, _
<[In](), Out()> ByVal atbFormanEfter() As PTB_FORMAN, _
<[In](), Out()> ByVal atbfunkEfter() As PTB_FUNK, _
<[In]()> ByVal atbparamsFore() As PTB_PARAMS, _
<[In]()> ByVal aNivaInfoFore() As PTB_PREMIE_NIVA_INFO, _
<[In](), Out()> ByVal atbpremieFore() As PTB_PREMIE, _
<[In]()> ByVal atbFormanInfoFore() As PTB_FORMAN_INFO, _
<[In](), Out()> ByVal atbFormanFore() As PTB_FORMAN, _
<[In](), Out()> ByVal atbfunkFore() As PTB_FUNK) As Int32
End Function
正如你看到的一些參數是由非託管代碼改變了。
請在此處編輯您的問題以包含您的MSDN帖子的要點。關於SO的問題應該是獨立的,無需在其他地方閱讀帖子。 – 2010-12-16 16:57:51
也我們試圖堅持這一點,並省略「嗨」和「謝謝」。 – 2010-12-16 17:05:01
我添加了MSDN帖子的biref摘要。 – Kimmen 2010-12-17 07:28:26