3

サードパーティの dll を使用してアプリケーションを開発しています。これは COM オブジェクトです。COM 登録不要を使用して、アプリケーションを分離しようとしています。しかし、これをすべて行う方法についての良い例/ウォークスルー/チュートリアルを実際に見つけることができません。私がしたことが正しいか間違っているか教えてください。

元の dll のマニフェストを作成し、tlbimp.exe を使用してタイル ライブラリを生成し、プロジェクトへの参照としてタイプ ライブラリを追加し、オブジェクトを正常にインスタンス化します。マニフェスト ファイルを既に提供していても、次のエラーが発生します。

System.Runtime.InteropServices.COMException は処理
されませんでした メッセージ = CLSID {7B3A2D19-1D82-4DF6-8939-B730058A5535} を持つコンポーネントの COM クラス ファクトリの取得に失敗しました。 )))。

これをグーグルで調べたところ、多くの人がビルド構成を指しているように見えますが、私はすでに x86 を使用するようにビルドを設定しています。dllもx86環境で開発されたと確信しています。(関係あるかどうかはわかりませんが..)

やった :

  • dll 内の内部 RT_MANIFEST を削除せずに、外部マニフェストを提供します。
  • mt.exe を使用して RT_MANIFEST を更新します。
  • 上記の両方で生成されたタイプ ライブラリを使用します。

ところで、マニフェスト内のバージョン要素に FILEVERSION または PRODUCTVERSION 番号のどちらを使用する必要があるのか​​も知りたいです。(私は両方試しましたが、どちらもうまくいきませんでした)

FileVersion と ProductVersion を示すプロパティ

どこで間違ったのか教えてください。マニフェストに間違った情報を提供しましたか? マニフェストにさらに必要な情報を知るにはどうすればよいですか?

さらに情報が必要な場合はお知らせください。ありがとうございます。

4

1 に答える 1

1

これはおそらくこのステップによるものです:

dll内の内部RT_MANIFESTを削除せずに、外部マニフェストを提供します。

Windows Server 2003 SP1以降、ファイルに内部マニフェストがある場合、Windowsは内部マニフェストを無視します。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest (DWORD) to 1このブログKB記事に記載されているレジストリ設定を試すことができます 。これにより、Windowsは内部マニフェストではなく外部マニフェストを認識します。

ただし、これを複数のシステムにインストールする場合は、すべてをインストールするすべてのシステムにこのフラグを設定する必要があります。そして、この設定はグローバル設定であり、すべてのアプリケーションに影響を与えるため、これはおそらく良い考えではありません。

于 2012-04-10T18:00:03.210 に答える