2010-12-16 69 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

相关问题