2

ActiveX COM コントロールとそのソース コードがあります。メソッドの入力パラメータの1つを変更したかったので、IDLなどを変更してCOM DLLとTLBを生成しました。

しかし、COM DLL を .NET プロジェクトにインポートすると、メソッドは古いシグネチャを保持していました。そこで、AXIMP を使って ActiveX DLL を生成してみました (まったく同じですが、試してみたかったのです)。

それでも、メソッドの署名は私が変更したものに変わりませんでした。

しかし、生成された TLB ファイルから TLBIMP を使用して相互運用 DLL を生成すると、メソッド シグネチャが正しく変更されました。

どこが間違っているのでしょうか?

ありがとう。

4

1 に答える 1

4

手動の手順が多数含まれているため、見落としがちです。タイプ ライブラリをどのようにインポートしたかによって異なります。複数の方法があります。[参照の追加 + COM] タブから参照を選択した場合、新しい COM サーバーを再登録するのを忘れている可能性があります。または、誤って新しいものではなく古いものを選択してしまいました。これは、必要に応じて GUID を変更し、古いものをクリーンアップするのを忘れた場合に発生する可能性があります。クリーンアップは非常に重要ですが、COM サーバーを再構築する前に行う必要があるため、見落としがちです。レジストリに大量のゴミが残る可能性があります。

確かに、Tlbimp.exe を直接使用することが、事故を回避するための最も信頼できる方法です。タイプライブラリで直接実行し、レジストリをまったく使用しないためです。

トラブルを最小限に抑えるためのレシピは次のようになります。

  1. 最初に regsvr.exe -u を実行して、古い COM サーバーの登録を解除します。
  2. 古い DLL ファイルと TLB ファイルを削除します。
  3. IDL を変更して新しいメソッドを追加します
  4. 変更したインターフェースに新しい IID を割り当てます
  5. インターフェイスを使用するコクラスに新しい CLSID を割り当てます
  6. ライブラリのバージョンをインクリメントする
  7. 出力 DLL の名前を変更します。名前にメジャー バージョンとマイナー バージョンを含めることをお勧めします。
  8. 新しい COM サーバーを構築する
  9. regsvr32.exe でサーバーを登録する
  10. Tlbimp.exe を実行して相互運用ライブラリを生成する
  11. .NET プロジェクトの古い相互運用ライブラリへの参照を削除します
  12. [参照の追加] + [参照] を使用して、新しい相互運用ライブラリを追加します

これらの手順のいずれかをスキップすると、ビルドの問題、レジストリの汚染、DLL 地獄が発生し、何もせずに大破した 1 日を過ごす可能性があります。

于 2013-02-15T11:18:50.903 に答える