2016-07-20 17 views
5

.NETにゆっくりと移行する必要があるVB6コードがあります。この中にはウェブへの呼び出しが必要なものもあります。私は.NET DLLからWeb呼び出しを行い、完了したらイベントを起動します。私はVB6でイベントを処理します。これで私のテストマシンと大半のユーザーのマシンで正常に動作しますが、イベントが発生したときにいつかプログラムの一貫したクラッシュが発生するユーザーもいます。.NETで非同期コードとイベントを安全に実行してVB6で処理できるようにするにはどうすればよいですか?

私はこれがスレッドの問題だと思っています。では、.NET側のスレッドをどのように処理する必要がありますか? .NETコードが呼び出されたときに同期コンテキストが存在しないので、それが問題である可能性があります。私はどのようにVB6の呼び出しスレッドに非同期操作を取得しますか?私のVB6コードはSTAであり、COMを介して自動的にVB6スレッドにマーシャルされることがありますが、間違っていたのでしょうか?私はそれが実際にスレッドの問題であれば、何をすべきかを十分に理解していません。

私は、コンピュータにクラッシュの問題があるパターンと見つからないパターンを見つけることができませんでした。

+2

はい、コンストラクタを呼び出したスレッドでイベントを発生させる必要があります。 SynchronizationContextが必要な場合は、簡単にWinformsフォームから取得できます。 1つは十分です、それは見える必要はありません、ちょうどそのハンドルのプロパティを読んで、それは行くのが良いです。 –

+1

ええと、VB6フォームからどうやって取得できますか?私は.NETでフォームを開けません – bzuillsmith

+2

可能性のあるターゲットマシンで.Netフレームワークを分けて比較しようとしましたか? Microsoftは最近の.Netフレームワークのバージョンに対して完全な下位互換性を主張していますが、その文が複数回見つかったのは基本的には純粋な馬鹿です。 – Stavm

答えて

2

私は間違っていて、いくつかの開発者のマシンを除いてすべてのユーザーのマシンで動作していないことがわかりました。問題は、.tlbファイルが生成および登録されていないことでした。

メインスレッドからイベントを発生させると、すべて正常です。

  1. あなたはおそらくフォームからのSynchronizationContextを経由して、バックメインスレッドにそれをもたらすことができます:あなたがイベントを発生さしかし、もし非同期あなたはそれがクラッシュすることなく動作させることができる唯一の2つの方法があります。
  2. 任意のスレッドからイベントを発生させ、自動的にVB6のSTAスレッドにマーシャリングさせることができますが、tlbオプションなしでDLLを登録するだけでレジストリにない追加のtlb情報が必要になります。このオプションは、SynchronizationContextを設定するUIスレッドを経由しないと便利です。

reg-free COMを使用している場合、オプション2にはアセンブリのマニフェストにcomInterfaceExternalProxyStub要素が必要です。その例については、question and answer hereを参照してください。

関連する問題