2

そのため、VB.NET でこの奇妙なエラーを把握するのに 2 時間を費やしました。最後にそれを理解しましたが、なぜそれが機能する場合と機能しない場合があるのか​​ わかりません。「MDIParentForm」という変数を持つ_Main.vbというMODULEを持つ2つのDLLがありました。両方の DLL を 3 番目のアセンブリの参照としてインポートし、次の操作を行うとします。

MDIParentForm = Something

どの「MDIParentForm」を設定していますか? 最初の議会のもの?第二議会で?「デバッグ」モードで実行すると、1 つのアセンブリが設定され、「リリース」モードで他のアセンブリが設定され、コードが壊れてしまうように思えました... 私は本質的に C#/Java プログラマーなので、実際にはわかりません「モジュール」が VB.NET でどのように機能するか、そのメンバーを呼び出すために名前空間やクラス名が必要ないため、設定しているメンバーをどのように知っていますか?

4

3 に答える 3

5

VB には、このようなコーディングの恐怖につながる可能性のある複数の「機能」があります。解決策は、モジュール メンバーをモジュール名で修飾することです。

VB で修飾されていないモジュール メンバーを使用できるという事実は、これが良い考えであるという意味ではありません。

于 2012-09-10T21:07:55.267 に答える
2

この機能は、オブジェクト指向言語ではなく手続き型言語であった VB 6.0 の遺産のほとんどです。

Microsoft は、VB 6.0 プログラムを .NET に簡単に変換できるようにするために、VB.NET 仕様で (私の謙虚な意見では) 不適切な決定を下しました。多くの VB 6.0 プログラムを変換してきた私は、ためらうことなく、変換を容易にするという目標に失敗したと言えます。

そうは言っても、この機能は関数やシングルトン オブジェクトなどのユーティリティに役立つと思います。

詳細と暴言については

実際の質問に答えるには...

識別子が同じアセンブリで定義されている場合は、そのアセンブリが使用されます。単一の参照アセンブリで定義されている場合は、そのアセンブリが使用されます。複数のアセンブリで定義されている場合は、アセンブリ名で完全に修飾する必要があります少なくともそれは私の理解です。

Option StrictOption Explicitがプロジェクト レベルでオンになっていることを確認します。また、vb ファイルの先頭にあるアセンブリの名前空間を 1 つだけインポートしてみてください。そうすることで、少なくともより一貫した結果が得られるはずです。

tl;dr

識別子へのすべての参照を、dll と名前空間の名前で完全に修飾するだけです。

于 2012-09-10T23:14:53.457 に答える
0

私はあなたのシナリオを複製しようとしましたが、( vbcVS2008 に対応して) 常にコンパイル エラーが発生します。

'MDIParentForm' is ambiguous between declarations in Modules 'Test.M' and 'Test.M'.

Option StrictこれはまたはOption Explicit Onとは無関係でしたOff

そして、明確にするために、「メンバーを呼び出すために名前空間またはクラス名は必要ないため」と言った:これは真実ではありませNamespaceん。次に、の内容Moduleです。

于 2013-06-29T06:28:17.717 に答える