2013-08-16 8 views
6

私は単純な.NETプロジェクト(クラスライブラリ)をCOMで表示しました。それはVB6で動作します!ClassInterfaceType.AutoDualを使用することは、VB6であっても実際には悪い考えですか?

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType::AutoDual)] 
public ref class MyObject 
{ 
    // Some methods and values 
} 

をアセンブリが適切に署名される(それはGACにない場合は不要)及び登録(regasm MyProject.dll /tlb /codebase):

コードは、次のように見えます。

次に、私のVB6プロジェクトでTLBファイルが参照されていて、すべてOKです!私は自分のクラスとその中の公開メソッドにアクセスできました。

インターネット上で、多くの人々がClassInterfaceType::AutoDualを使用するためのアセンブリを使用するアプリケーションを破ることができバージョニングの潜在的な問題のために、良いアイデアではないと言います。

しかし、私の場合、本当に問題はありますか?このアセンブリは、VB6プロジェクト(早期バインディング)でのみ使用されます。すべての新しいリリースでは

、私は戻って、ステップ(ように登録して、署名を)学位論文ありません。このソリューションのバージョン管理に問題はありますか?とにかく

、私はいくつかの[GUID("...")]の属性を記述することができますか?クラスは、各コンパイル時に同じGUIDではありませんので

のGUIDは、Visual Studioのことで自動的に生成されます。そうですか?

答えて

11

AutoDualを使用しない場合、VB6の初期バインディングは機能しません。また、VB6エディタで自動補完機能が働かないため、ランタイムエラーの原因となる入力ミスのリスクが高くなります。 VB6のプログラマーはこれに慣れている傾向があります。

確かに危険です。 COMサーバーを更新して[Guid]を指定して間違えた場合、VB6プログラムが実行時に完全に診断不能なエラーでクラッシュする大きなリスクがあります。あるいは悪いことに、全くクラッシュすることなく、完全に間違った方法を呼び出すこと。

あなたは.NETの自動生成[のGUID]聞かせた場合は、強くお勧めします、あなたは、ハードクラッシュを得ることはありませんが、実行時にエラー「ActiveXコンポーネントはオブジェクトを作成できません」。これはもう少し有益で、危険性は低いですが、あなたやユーザーに問題の場所をほとんど知らせません。あなたがComInterfaceType.InterfaceIsIDispatchを使用している場合

は、その後VB6プログラマは、遅延バインディングを使用してオブジェクトを作成するのGetObject()を使用するように強制されます。 [Guid]はこれ以上重要ではなく、変更があまりにも過激でない場合は、既存のVB6コードでCOMサーバーを使用する可能性が高くなります。たとえば、メソッドが余分な引数を取得した場合、それはまだ爆弾です。それは、より良いランタイムエラーがあります。そうでなければ、VB6プログラマがもちろん当てはまらないメソッドのロジックの変更を治すことはできません。欠点は、メソッド呼び出しが大幅に遅くなることです。

+0

返信いただきありがとうございます!明確にするために、プロジェクトでは、目的は以下のとおりです。1)VB6でのIntellisenseの使用2)次のようなオブジェクトを使用します。「Dim myobj As New MyObject」。それから、私の解決策はいいですね。 –

+2

私はすでに私の答えで、自動補完はIntelliSenseと同じことであり、GetObjectを使用したくないことに取り組んでいます。明らかに、AutoDualの使用を強くお勧めします。 –

+0

多くの感謝!要するに、(regasmで)アセンブリを適切にアンインストールして再インストールすると、自動生成されたGUIDとAutoDualを使用していても、バージョン管理に問題はありません。 DispIDはどうですか? –

関連する問題