5

私が持っている (SC_COM.dll という名前の) COM オブジェクトの C# ラッパーを生成しようとしていますが、Visual Studio 2008 (Vista を実行) とのリンクで問題が発生しています。COM DLL を使用してこれを登録なしで行う必要があります。マニフェスト ファイルを使用して、Visual Studio に SC_COM.dll について知らせるようにしていますが、これは機能しているようです。TblImp.exe を使用して、Visual Studio 2008 で参照しているタイプ ライブラリ (SC_COMtlb.dll) を生成し、必要な DLL との早期バインディングを実行できるようにしました。DLL は、マニフェストおよび実行可能ファイルと同じディレクトリにあります。

問題は次のとおりです。オブジェクトをインスタンス化し、C# でそのメソッドの 1 つを呼び出そうとすると、次のエラーがスローされます。

エラーが検出されました: タイプ 'SC_COMtlb.SCAccessObjClass' の COM オブジェクトをインターフェイス タイプ 'SC_COMtlb.ISCUploader' にキャストできません。IID '{C677308A-AC0F-427D-889A-47E5DC990138}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: No such interface supported (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .

このエラーが何を意味するのか完全にはわかりません。エラー コードを検索したところ、比較的一般的な C# エラーのようです。ここで COM オブジェクトを間違った方法でリンクしようとしているのですか、それとも見逃している可能性のある重要なステップが他にありますか?

システムに登録されていないため、作成したタイプ ライブラリ (S\C_COMtlb.dll) が実際の COM DLL の場所をどのように認識しているか完全にはわからないことに注意してください。ディレクトリ。これが問題になる可能性がありますか?もしそうなら、どうすれば2つをより適切にリンクできますか?

4

3 に答える 3

6

これを App.exe.manifest に追加してみてください:

<comInterfaceExternalProxyStub 
  name="ISCUploader" 
  iid="{C677308A-AC0F-427D-889A-47E5DC990138}"
  proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
  baseInterface="{00000000-0000-0000-C000-000000000046}"
  tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />

TLBID は、Visual Studio で生成された Native.Namespace.Assembly.Name.manifest から見つけることができます。次のようになります。

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

私はかなり長い間これに頭を悩ませていましたが、これらの役立つ参考文献を見つけてつなぎ合わせたところ、うまくいきました。

于 2009-06-29T15:38:41.460 に答える
1

どのバージョンの Windows? Windows Vista 以降、内部マニフェストは外部マニフェストをオーバーライドします。デフォルトでは、C# 実行可能ファイルには内部マニフェストがあるため、whatever.exe.manifestファイルは無視されます。

C# EXE のプロパティ ページに移動すると、[アプリケーション] タブに [アイコンとマニフェスト] セクションがあることがわかります。「マニフェスト」をマニフェスト ファイルの名前に設定すると、デフォルトのファイルの代わりに埋め込まれます。

それでもうまくいかない場合は、MT.EXE を使用してビルド後の手順を実行して、外部マニフェストを既定の内部マニフェストとマージし、マージしたマニフェストを .EXE ファイルに戻す必要がある場合があります。

于 2009-06-01T17:56:50.207 に答える
1

エラーコードは、特定のオブジェクトが特定のインターフェイスを実装するはずであるとVisual Studioが考えていることを意味しますが、そのインターフェイスに「接続」しようとすると、オブジェクトはそれについて知らないと応答します。

問題は SC_COM.dll にあると思います。TLBIMP.EXE は、DLL 内に格納されているメタデータからクラスとインターフェイスの情報を抽出し、クラスのラッパーを構築します。

たとえば、SC_COM が C++ で記述されている場合、DLL の作成者が IDL ファイルでクラスがそのインターフェイスを実装することを示していても、実際のコードではそのインターフェイスがサポートされていない場合に、これが発生する可能性があります。

この DLL が持つ可能性のある別の一般的な問題の原因は次のとおりです。ISomething インターフェイスから派生した ISomething2 インターフェイスを実装するクラスがある場合がありますが、クラスの実装は ISomething2 しか認識しません。派生インターフェイスを実装する場合は、その基本インターフェイスも認識する必要があります。これはよくある間違いです。

DLL のソース コードを持っていますか (そして管理していますか?)

于 2009-06-01T18:59:42.917 に答える