C# で記述された DLL があり、COM の可視性が設定されています。サイド バイ サイド アセンブリとしてセットアップし、アプリケーションをクライアント PC に登録なしで正常に展開できます。私の質問は、開発用 PC に関するものです。同様の登録不要の方法で DLL に対してコンパイルすることは可能ですか、それとも開発マシンで登録が必要ですか? メニューからDLL を直接追加しようとしましたが、Project -> References
「特定のファイルへの参照を追加できません」というエラーが表示されます。DLL は .vbp ファイルと同じディレクトリにあり、クライアント アプリ マニフェストが存在する場合と存在しない場合の両方で DLL を追加しようとしました。
1 に答える
Project -> References メニューから DLL を直接追加しようとしました
これにより、タイプ ライブラリへの参照が追加されます。タイプ ライブラリは、言語に依存しない COM コンポーネントの型の記述であり、VB6 はこれを使用して、効率的なコードを生成する方法を認識し、型チェックとオートコンプリートを提供します。タイプ ライブラリは、.NET アセンブリのメタデータとまったく同じです。
従来、VB6 が行っていた方法では、タイプ ライブラリはリソースとして DLL に埋め込まれていました。そのため、おそらくダイアログで DLL を選択することに慣れているでしょう。ただし、DLL が C# によって生成される場合はうまく機能しません。タイプ ライブラリは、C# コードがコンパイルされた後にのみ生成されます。VB6 ダイアログで .tlb ファイルを選択する必要があります。従来の方法では、COM コンポーネントを IDL 言語で記述することから始めます。コードをコンパイルする前にタイプ ライブラリを生成できるため、最終的な DLL に簡単に埋め込むことができます。C# でも技術的には可能ですが、ビルド手順は非常に面倒で骨の折れる作業であり、基本的に異なるビルド コマンドを使用して DLL を 2 回ビルドする必要があります。
C# ライブラリのタイプ ライブラリは、通常、次の 3 つの方法のいずれかで生成されます。
- Project + Properties、Build タブ、"Register for COM interop" オプションを使用します。これには、レジストリに書き込むことができるように、VS を管理者特権で実行する必要があります。ショートカットを右クリックし、[管理者として実行] を選択して、昇格した VS を起動します。
- /tlb:filename オプションを使用して Regasm.exe を実行する。最初の箇条書きの代替であり、何らかの理由で VS を昇格させたくない場合に必要です。開発マシンで /codebase オプションを使用すると、最初の箇条書きとまったく同じように機能し、gacutil.exe を使用して DLL を GAC に配置する必要がなくなります。
- .NET アセンブリのタイプ ライブラリ エクスポータである Tlbexp.exe ユーティリティを実行する。登録は行われず、.tlb ファイルのみが生成されます。
最初の箇条書きは通常の選択であり、この方法でタイプ ライブラリを更新することを決して忘れないため、非常に望ましいものです。ユーザーのマシンでのreg-free展開のみを本当に気にするので、開発マシンではまったく問題ありません。もうこれをしないと、おそらく問題が発生します。
3 番目の選択肢を使用しても問題なく、目標との互換性が高くなります。Visual Studio コマンド プロンプトからTlbexpを実行します。C# コードを変更するときは、もう一度実行する必要があることに注意してください。これを一度忘れて頭髪の塊を失い、C# の変更が有効に見えない理由を理解しようとしたり、診断が難しいエラー コードを取得したりすると、最初の箇条書きをもう一度検討する多くの理由が得られます :) エミュレートできます/uninstall オプションを指定して Regasm.exe を実行することにより、reg-free シナリオを実行します。