問題タブ [tlbimp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 自動ビルドに「COMReference」の代わりに「COMFileReference」を使用していますか?
継続的インテグレーション サーバー (Jenkins) に Windows Mobile 6.0 C# プロジェクトを配置しようとしています。
TLB を参照するプロジェクトをコンパイルしようとすると、エラーが発生します:
ResolveComReferences
always return TYPE_E_LIBNOTREGISTERED
。異なる開発者間でプロジェクトを渡す場合でも、参照を再度追加する必要があります。
COMFileReference
の代わりにを使用して、プロジェクト ファイルに実行できる変更に関する何かを見つけましたCOMReference
。
.csproj ファイルを変更せずにこれを解決する方法はありますか?
com - COM InterOp を介して複数のインターフェイスを公開する CoClass にアクセスする方法は?
以下のように説明されている CoClass があります。
だから私の質問は:
- 両方のインターフェイスを表示するのに、インターフェイス
tlbimp
のみを公開するのはなぜですか?IFoo
oleview.exe
tlbimp
インターフェイスのみを公開[default]
し、その理由は? (MSDN によると、[default]
「マクロ言語による使用を意図しています。」 )- このケースを MIDL/COM でモデル化するにはどうすればよいですか? 継承の代わりに関連付けを使用する必要がありますか?
c# - TLBIMP と AXIMP の結果の違い
ActiveX COM コントロールとそのソース コードがあります。メソッドの入力パラメータの1つを変更したかったので、IDLなどを変更してCOM DLLとTLBを生成しました。
しかし、COM DLL を .NET プロジェクトにインポートすると、メソッドは古いシグネチャを保持していました。そこで、AXIMP を使って ActiveX DLL を生成してみました (まったく同じですが、試してみたかったのです)。
それでも、メソッドの署名は私が変更したものに変わりませんでした。
しかし、生成された TLB ファイルから TLBIMP を使用して相互運用 DLL を生成すると、メソッド シグネチャが正しく変更されました。
どこが間違っているのでしょうか?
ありがとう。
.net - 相互運用DLLを簡単に更新するにはどうすればよいですか?
VS 2005(VB .Net)に.NETプロジェクトがあると仮定します。このプロジェクトは、非GUICOMオブジェクトを使用します。このオブジェクトへの参照を追加すると、VSは相互運用DLLを作成します。しかし、別のプロジェクトのCOMオブジェクトに新しいメソッドを追加します。明示的に呼び出さずに相互運用DLLを更新するにはどうすればよいtlbimp
ですか?IntellisenseにこのCOMオブジェクトの新しいメソッドのリストを表示させたい。
c# - 生成された C# 相互運用 DLL での COM OLE_HANDLE タイプの不一致
私は、使用しているコア C# アプリケーションの依存関係である Microsoft Visual C++ COM プロジェクトを継承しました。プロジェクトを再コンパイルし、(tlbimp を使用して) 相互運用 DLL を再生成すると、OLE_HANDLE を受け取るライブラリ内のいくつかのメソッドが、以前のバージョンの相互運用 DLL から署名を変更します。
以前の相互運用性が生成されたとき、私は周りにいませんでしたが、Windows Server 2003 / Windows XP 上の VS2005 でコンパイルされたことはほぼ確実です。私のワークステーションは現在、Visual Studio 2010 (x64 用の C++ Visual Studio Compiler バージョン 16.00.40219.01) を使用する Windows 7 です。
これは、元の DLL と新しい DLL (ILSpy を使用) 用に生成された C# インターフェイスです。
新しいインターフェイス(2 番目のパラメーターは、ComAliasName 属性を使用してマーシャリングされ、int として):
古いインターフェイス(2 番目のパラメーターは uint):
私が見る限り、入力 IDL ファイルは変更されておらず、OLE_HANDLE の定義に影響を与える #includes / 条件付きステートメントもないようです。
問題のメソッドが呼び出されるたびに、AccessViolationException がスローされます。
生成されたインターフェイスが変更された理由 (MIDL/TLBIMP の変更によってこの動作が発生するかどうかわからない) や、これをさらにデバッグする方法を知っている人はいますか?
ヘッダ:
メソッドの C++ ソース:
c# - WriteProfileString などの静的 COM モジュールのインポート
WriteProfileString
16 ビット バージョンの Windows との互換性のためにのみ提供され ている を使用する従来の VB 6 アプリケーションがあります。
私はそれを機能的に同等の (正確なクローンを意味する) .NET アプリケーションに移行しています。これには、 TlbImp.exeWriteProfileString
を使用して、COM オブジェクトの TLB ファイルから Interop アセンブリを生成する必要があります。これは必須であり、P/Invoke は使用できません。
そうすると、TlbImp.exe によって空のアセンブリが生成されます。
WriteProfileString
次の IDL があります。
幸いなことに、Microsoft は、TlbImp2.exe という名前の TlbImp.exe の次のバージョンをオープン ソース化しました。
コードをデバッグすることができ、TlbImp.exe と TlbImp2.exe の両方がモジュールからメソッドをインポートしないことがわかりました。TlbImp2.exe にモジュールの静的メソッドをエクスポートさせるために、コードをハックする必要がありました。
ConvModule.csファイルを変更する必要がありました。
そして、次のメソッドをConvCommon.csに追加します。
そのため、メソッドが正しくエクスポートされるようになりましたが、そもそもこれらのメソッドをエクスポートしなかった理由はまだ疑問に思っています。
これは、エクスポートされたアセンブリのコードです。
抽象メンバーを持つ静的クラスを生成します。それは意味がありません。もちろん、コードを変更して別の方法でエクスポートすることはできますが、そもそも TlbImp2.exe がそうするのはなぜですか?
モジュールの定数をエクスポートするため、そのようにエクスポートすると想定しています。私は正しいですか?WriteProfileString
相互運用で確実に使用できるようにするには、メソッドにどの修飾子を適用する必要がありますか?
c# - csproj から Exec tlbimp への msbuild パスは何ですか?
csproj でコーディングしているビルド前のターゲットを実行したいと考えています。これは、プロジェクトが参照する dll を生成するために tlbimp を実行する必要があります。
tlbimp を実行しようとしていますが、見つからないというエラーが発生します。パスを推測するために使用できる msbuild 変数または環境変数はありますか?
c# - MIDL が tlb を作成できない場合はどうしますか?
C# インプロセス サーバーを作成しようとしていますsbtsv.idl
(これは Windows 8 SDK に含まれています)。私が見つけたほとんどすべての指示ではMIDL
、.tlb
ファイルtlbimport
を作成してからプロキシ dll を作成するように指示されています。
ただし、IDL にセクションが含まれていない場合、library
ファイルは.tlb
生成されず、セクションは含まれsbtsv.idl
ませんlibrary
。
ライブラリ内に作成したいインターフェースを宣言したIDLファイルを自作してみた
ただし、実行しようとするとMIDL
、次のエラーが発生します
クラスとインターフェースを手作業で書かなければならないと思っていますが、これが機能するのに何か間違ったことをしていないかどうかを確認したかったのです。
c# - インポートされたアセンブリの CoClass インターフェイスは正確には何のためですか?
ツールを使用して基本タイプ ライブラリをインポートすると、tlbimp.exe
常に各 のインターフェイスが作成されますcoclass
。たとえば、この IDL 記述
結果:
- COMインターフェイス
IFoo
の表現としてのインターフェイス、 BarClass
COM コクラスの表現としてのクラスとBar
で注釈が付けられたインターフェイスCoClassAttribute
。
Bar
との GUIDIFoo
が等しい場所。MSDNは、このトピックについて次のように述べています。
このインターフェイスは、コクラスの既定のインターフェイスと同じ IID を持っています。このインターフェイスを使用すると、クライアントは常にイベント シンクとして登録できます。
それが私がこのトピックで見つけた唯一のものです。CoClassAttribute
により、インターフェイスを使用して実際のクラスのインスタンスを作成できることを知っています。BarClass
また、(実際には) を使用してクラスの新しいインスタンスを作成できることも知っています。私が理解していないのは、イベント ソースが定義されていないため、イベント シンクを接続できないBar
場合でも、インポート プロセスがインターフェイスを生成する理由です。coclass
Bar
この例でインターフェイス1を削除することは可能でしょうか、それともまだ考慮していない他のリスクがありますか?
1 たとえば、相互運用アセンブリを分解します。