|
返信が遅くなって申し訳ありません。
■No60884 (くり太郎 さん) に返信
くり太郎 さん
返信ありがとうございます。
> とりあえず、別に新規プロジェクトを作って、現象を再現させながらシンプル化させていきながら原因箇所を調べていくのが良いと思います。
> .NET Framework 3.5 から 4 に変更させただけで StackOverflowException 例外というのは考えにくいですよねぇ・・・
新規プロジェクトを作成してテストしてみました。
以下のようなテストをしてみたのですが結果は同じでした。
@メインフォームのボタンをクリックし、空っぽのダイアログを表示したLoadイベントで、DLLコールを実施(現在の状態とほぼ同じ) → ダイアログを閉じたときにShowDialogでStackOverflowException例外発生
Aメインフォームのボタンをクリックし、DLLコール → コール終了後、メイン画面に戻った際にApplication.RunでStackOverflowException例外発生
もう少しいろいろと試してみようと思います。
> 開発環境は 64 bit ですか?
開発環境は32bitです。
■No60890 (ロートルプログラマ さん) に返信
ロートルプログラマ さん
返信ありがとうございます。
> DLL側でchar *で受けてるString 変数B はC#が期待するような返し方はしませんよ。たぶん。
> 変数B をいわゆるbyte型の配列で十分な大きさに確保して渡してください。あ、これはDLLが
> 変数Bを変更してるという場合ですが。書き込みの文脈からするとDLL側で変数Bを変更するよ
> うに見えます。
すいません、私の書き方がわかりづらかったみたいで。。。
DLLで変数Bの変更はしていません。
変数BにはXMLファイルのパスセットして、そのXMLファイルにDLL内の処理であるファイル情報を書き込んでいます。
その後、変数Bにセットしてあったファイルパスを利用し、XMLファイルから内容を取得しています。
■No60891 (Azulean さん) に返信
Azulean さん
返信ありがとうございます。
> 1 度、C++ での関数宣言と現状の C# での DllImport の宣言を書いてもらったら話は早そうな気がしました。
> # .NET 3.5 vs 4 の違いは推測がつかないけれども。
<C#>
[DllImport("OutPut.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static int _OutPutData( string CheckPathA, string CheckPathB, string XmlFile );
//DLLコール
int nRet = _OutPutData( Path, string.Empty, XmlFile );
<C++>
int OutPutData(char* CheckPathA, char* CheckPathB, char* XmlFile)
このような感じです。
※CheckPathBは使用していないため、string.Emptyで渡しています。
ちなみに、DllImport宣言で、.NET Framework3.5では『CallingConvention = CallingConvention.Cdecl』は書いていませんでしたが、
.NET Framework4では、PInvokeStackImbalanceが検出されるため、追記しました。
|