2011-05-12 7 views
1

を、インターフェイス/ GUID/etcが同じであれば、別の言語で書かれた新しいコードに置き換えることはできますか?初期バインドされたモジュール

私はいとこのポストに詳細であるとして、これを行うにしようとしています:

Legacy VB6 app replacement

しかし、私は本題にするだろうと思いました。

ありがとうございます!

+0

私はCOMを使って可能かもしれないと思います。それは行く(または滞在する)非常に楽しいルートではありません。 COMの相互運用性のために.NETを公開することは可能ですが、これが潜在的な解決策であるかどうかは不明です。 –

+0

これは、私が交換しようとしているモジュールがCOMであったために行ったルートです。しかし、私はちょうどそれを私はすべてのIDとコールが整列するように見えても、自動化エラーを取得し続けることはできません。 –

+0

@Joh Hウォンキーなレジストリ設定やその他の一般的なエラーのような、置き換えられるCOMオブジェクトを読み込むとエラーになることはありますか?つまり、PowerShellや新しいプロジェクトなどの新しいコンテキストから置換をロードできますか? (私はこれがCOM CLSID "保証"に非常に多くの点で違反していると思います。) –

答えて

1

VB6(または何か他のもの)に含まれていたCOMコンポーネントを参照していて、今はVB.net(またはC#)になりたいVB6アプリケーションについて話しているので、Dynamicはこの場合役に立ちません。

しかし、あなたはこれを行うことができるはずです。

置き換えるCOM DLLのMIDLを生成するには、OLEView(または類似のもの)を使用する必要があります。これは、そのDLLで定義されているすべてのクラスとインターフェイスの特定のGUIDSを提供します。

次に、すべてのクラスとインターフェイスに1つのGUIDを指定してDLLの.netバージョンをコードする必要があります。あなたは.NETのドキュメントを見てみたいと思うでしょう

属性:

のComVisible のGuid InterfaceTypeは

と、おそらくいくつかのより多くを。これらのattrsを使用すると、dllのどのオブジェクトやインタフェースに対してGUIDSを使用するかを明確に指定することができます。

基本的には、2つのDLL(古いものと新しいもの)のTypelibsを生成するときに、同じtlbsで終わるはずです。そうしないと、新しいものは古いものと互換性のある早期バインドされた参照ではありません。

+0

ありがとう、あなたは私が取っているアプローチを確認しました。しかし、彼らはどのくらい完璧に整列しなければなりませんか?例えば、新しいコードの私のIDLコクラスの参照にはすべて、_Objectへのインタフェースが含まれていますが(明らかに)VB6のものはそうではありません。正しいインタフェースは、[default]インタフェース_BIBranchDetailsのようにもあります。 完璧はどのように完璧ですか?たとえば、私の使用していない呼び出しが信号IDLに含まれている場合。彼らはまだ一致する必要がありますか?また、それはVB DAからの 'RecordSet'オブジェクトを使用する 'SetData'への呼び出しを持っていますが、それを一致させる必要がありますか?または空の定義を定義できますか? –

+0

VB6アプリケーションでクラスやインターフェイスを参照していない場合は、そのコンポーネントを含める必要はなく、間違いなくクラスとインターフェイスを別のGUIDに含めることができます。だから、基本的に、あなたは正しいです。彼らは、ホストプログラムが参照するGUIDが何であれ、まったく整列する必要はありません。 – DarinH

1

COMと通信する際に発生する問題の多くは、C#4.0のdynamicを使用して解決できます。

dynamicこれらの痛みのいくつかを緩和するために、オブジェクトとオプションのパラメータが導入されました。

+0

消費する環境が.netでない場合、これは役立ちますか?しかし、交換モジュールは? –

関連する問題