1

dll の機能を知りたいので、ac# プロジェクトに追加しました。dll からインクルードされたクラスのインスタンスをコードで作成すると、次のエラー メッセージが表示されます。

CLSID {D5BED98C-C4EE-4D41-A624-6CFD9106F31B} を持つコンポーネントの COM クラス ファクトリを取得できませんでした: 80040154 クラスが登録されていません (HRESULT からの例外: 0x80040154 (REGDB_E_CLASSNOTREG))。

プラットフォーム ターゲットを既に x86 に変更しました。

dllも登録しようとしましたが、エントリポイントがないようです。dll コンテンツが実行可能ではないという理由で、私は何を見逃しましたか?

編集:これが私の「コード」です:

            this.acfg = new ACFG_Info();

前もって感謝します!

4

2 に答える 2

4

COM コンポーネントを使用しています。COM は多くのことを自動的に行います。ここで問題となっている機能は、ディスク上の DLL を見つけてロードし、作成したクラスを実装するコードを見つけてそのインスタンスを作成する機能です。シンプルに聞こえますが、.NET は確かにシンプルに見えますが、そうではありません。適切な DLL を見つけることは決して簡単ではありません。

それは非常に早い段階で爆発し、DLL を見つけることはできませんでした。DLL を見つけるために、COM はレジストリを調べて、クラスに関する詳細を見つけます。それが知っているのは、クラスを識別する一意の数値だけです。略して CLSID と呼ばれます。その番号は、 new演算子を使用してクラスのインスタンスを作成したときにプログラムにコンパイルされました。エラーメッセージは、その番号がどのように見えるかを示しています。それ以外は、System.Guid クラスとまったく同じ動物です。

COM がレジストリを介してどのように見えるかを確認する非常に良い方法は、SysInternals の ProcMon ユーティリティを使用することです。プログラムが winapi を使用してレジストリにアクセスする方法を記録します。通常、ProcMon によって生成されたトレースには山ほどの情報があります。エラー メッセージに表示されている番号をトレースで検索して、興味深いビットを見つけてください。レジストリ キーを検索しても見つからないことがわかります。これにより、最終的に「クラスが登録されていません」というエラーコードでプログラムが爆発します。

クラスの「登録」は、COM コンポーネントが使用可能になる前に一度実行する必要があるインストール手順です。COM サーバーを提供するベンダーは、通常、インストール プログラムを提供するので、これに対応できます。通常、 Regsvr32.exeを実行するだけで十分です。しかし、それは最新の 64 ビット オペレーティング システムでは単純ではなくなり、さまざまな方法で問題が発生します。コマンドプロンプトを管理者特権で実行するのを忘れるのと同じです(「管理者として実行」を使用します)。または、間違ったバージョンの Regsvr32.exe を使用すると、32 ビット バージョンのプログラムである c:\windows\syswow64\regsvr32.exe が必要になります。

または、インストール手順がより複雑な場合、COM dll には依存 DLL が含まれている可能性があり、COM dll が適切に機能するためには、最初にインストールする必要があります。または、実際にはアウト プロセス サーバーであり、/regserver コマンド ライン オプションで実行して登録する必要がある exe です。または、クライアント プログラムでマニフェストを使用して正しく動作するように設計されています。など、これは急いで複雑になる可能性があります。

これらのトラブルシューティングのヒントでうまくいかない場合は、ベンダーのサポートが必要です。彼らは何が必要かを正確に知っているでしょう。ここではそれを推測することしかできません。

于 2013-06-08T13:33:06.617 に答える