我有一个关于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