2010-12-16 21 views
1

p/invokeに関する管理対象コードから非管理コードへの問題があります。私のオリジナルのpost at the MSDN forumを見てください。私が続ける前に、私はちょうどいくつか説明したいと思います:ネット3.5にラッパーアセンブリがあり、アンマネージドコードへの実際の相互運用を行います。それから私はラッパーアセンブリを使用する私のコンソール "ホストapp"を持っています。pInvoke、.net 4 vs 3.5

ホストアプリケーションが.net 4を使用しているときに私が思い描いた解決策(私は私のMSDNポストを参照しています)は動作しますが、.net 3.5を使用するようにホストアプリケーションを変更すると動作しません。変更すると、私はAccessViolationExceptionを取得します。

  • ホストアプリ:4.0、ラッパーアセンブリ:3.5 - >
  • ホストアプリ作品:3.5、ラッパーアセンブリ:3.5 - >が AccessViolationException

をスロー誰が、なぜ私に手掛かりを持っていますがAccessViolationExceptionを取得しますか?最も重要なのは、どうすれば.net 3.5で動作させることができるのでしょうか?

私が言及したMSDN記事の簡単な要約。私はこの乱雑なp/Invokeを解決する必要があります。 PTBは、各引数は任意の長さの配列に構造体のポインタであることを意味する

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); 

:Cの宣言は次のようになります。構造体には、ほとんどが文字列、倍精度、charおよびshortが含まれます。あなたは、引数の一部も同様に、アンマネージコードによって変更されて見たよう

<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 

:とにかく、私はこのDLLIMPORT文で終わりました。

+0

ここで質問を編集して、MSDNポストの要点を含めてください。 SOに関する質問は、別の場所で投稿を読む必要はなく、自分で立つべきです。 –

+0

また、私たちはここにこだわり、 "Hi"と "Thanks"を省略しています。 –

+0

MSDN投稿のbirefサマリを追加しました。 – Kimmen

答えて

0

それがAccessViolationExceptionの唯一の理由であるかどうかはわかりませんが、その例外は破損したCランタイムライブラリヒープで実行されているアンマネージコードから発生しています。特に、有効なポインタを含むことを意図したメモリの一部には、ガベージが含まれていました。逆参照されると、存在しないメモリを指していました。

このような問題がある場合、.NETバージョンの変更により、問題が.NET 3.5では発生していても、まだではなく、が.NET 4.0 。

コードをデバッガで実行し、ネイティブコードのデバッグを行うことをおすすめします。元の例外が見つかることがあります。

+0

私は適切な解決策を見つけるために "実験"していたとき、私はいくつかの不適切なマーシャリングを行ったときにAccessViolationExceptionを取得しました。たとえば、In属性を省略します。 – Kimmen

関連する問題