2010-12-16 99 views
1

我有一個關於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 

正如你看到的一些參數是由非託管代碼改變了。

+0

請在此處編輯您的問題以包含您的MSDN帖子的要點。關於SO的問題應該是獨立的,無需在其他地方閱讀帖子。 – 2010-12-16 16:57:51

+0

也我們試圖堅持這一點,並省略「嗨」和「謝謝」。 – 2010-12-16 17:05:01

+0

我添加了MSDN帖子的biref摘要。 – Kimmen 2010-12-17 07:28:26

回答

0

我不知道它是否是AccessViolationException的唯一原因,但我看到異常來自運行時出現損壞的C運行時庫堆的非託管代碼。特別是,一些意味着包含有效指針的內存包含垃圾:當解除引用時,它指向非遠程內存。

如果你有這樣的問題,那麼.NET版本的改變可能只是簡單地解決了這個問題,例如在.NET 3.5下可以看到這個問題,但是沒有,但是在NET 4.0下看到了

我建議在調試器下運行代碼,幷包括本機代碼調試。你可能會發現原來的例外。

+0

當我在「試驗」尋找適當的解決方案時,當我做了一些不合適的編組時,我得到了AccessViolationException。例如省略In屬性。 – Kimmen 2010-12-17 13:22:01

相關問題