問題タブ [tlbexp]
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.
.net - ネストされた配列を .NET から COM に公開する
を返す .NET (C#) のメソッドがありますstring[][]
。RegAsm または TlbExp (.NET 2.0 SDK から) を使用して、含まれているアセンブリの COM タイプ ライブラリを作成すると、次の警告が表示されます。
警告: ネストされた配列のマーシャリング サポートはありません。
この警告により、問題のメソッドは生成されたタイプ ライブラリにエクスポートされません。Variant を COM の戻り値の型として使用し、COM クライアント側で /etc をキャストする方法があると言われました。この特定のアセンブリでは、対象となるクライアント オーディエンスは VB6 です。しかし、これを .NET 側で実際に行うにはどうすればよいでしょうか。
注: 戻り値の型が Variant である既存のレガシー DLL (エクスポートされたタイプ ライブラリを含む) がありますが、この DLL (および .tlb) は .NET 以前のレガシー ツールを使用して生成されるため、それらを使用できません。
アセンブリが代わりに VB.NET で記述されていれば、まったく役に立ちますか?
.net - COM インターフェイスの質問 - .NET
最近、相互運用マーシャリングについて読んでいましたが、まだ 1 つのことを理解していません。.NET アセンブリを COM で認識できるようにするには、tlbexp ツールや regasm ツールを使用する必要があります。COM を .NET アセンブリから見えるようにするには、tlbimp ツールを使用する必要があります。
それとは別に、GUID 属性、IUnknown および IDispach を使用して COM インターフェイスを処理するコードをインターネットでたくさん見てきました。
私の質問は、これらすべてが COM にどのように関連しているかということです。それを使用する必要がありますか? 私は認定の準備をしていますが、インターフェイス、GUID、IUnknown などについては何も言われませんでした...
曖昧なことを残すのはあまり好きではないので、どなたか説明していただけるとありがたいです。
- COM からインポートされたタイプ ライブラリ (tlbimp ツール) についても 1 つ質問があります。COM からインポートされたタイプ ライブラリは、システムに登録された COM オブジェクトを必要としますか?
よろしくお願いしますPK
.net - RegAsm.exeを使用せずにタイプライブラリを登録する方法
RegAsmツールを使用せずにタイプライブラリを登録できるかどうか知りたいです。これが私の状況です。これは、私がこれを実行したい理由をうまく説明するでしょう。
古いVB6アプリケーションにいくつかの最新機能を提供するアセンブリを.NETで開発しています。次のように、RegAsmを使用して、開発マシンにアセンブリとタイプライブラリを正常に登録しました。
上記のコマンドは、タイプライブラリ(MyAssembly.tlb)を生成して登録し、アセンブリを登録します。VB6でIntellisenseを使用できるように、タイプライブラリを登録する必要があります。
このメソッドの問題は、タイプライブラリファイルを生成するときに、 TlbExp.exe の場合と同じレベルの制御ができないことです。特に、TlbExpの/ namesフラグを使用して、プロパティ名の適切な大文字と小文字を指定する必要があります(RegAsmはそれらを削除します)。したがって、TlbExpを使用してtlbファイルを生成する場合、アセンブリ登録プロセスとは別に登録する方法はありますか?
編集: da_m_nの答えは私が尋ねた質問に対して正しいです。しかし、RegAsmがタイプライブラリを登録できたという理由だけで、VB6で参照するためにtlbを登録する必要があるという誤った仮定の下にありました。したがって、今のところ、アセンブリを登録し、未登録のTlbExpで生成されたtlbを固定名で参照しています。
c# - tlbexp.exeはメソッド名の大文字と小文字を変更します
私はかなり奇妙な問題を抱えています。インターフェイスをC#ライブラリからCOMにエクスポートしています。「COMで登録」プロジェクト設定を有効にしたので、tlbexp.exeを呼び出してタイプlibを作成します。
メソッド名にキャメルケースを使用していますが、エクスポートされたタイプライブラリによって、クラス名と一致するすべてのメソッドがPascalケースに変更されることに気付きました...
例えば
タイプlibでエクスポートされたIFooは、IFoo-> randomClass()ではなくIFoo-> RandomClass()を定義します。
これを引き起こす原因とそれを止める方法についてのアイデアはありますか?
dll - COM dll で tlbexp.exe を使用する
Centuraと COM .dll間の通信をセットアップしようとしています。(データベースのインポート用にhttp://download.resip.frからダウンロード)
Centura がこのコンポーネントと通信するには、.tlb ファイルが必要です。通常regasm /tlb
、.tlb を生成するために使用しますが、COM .dll であるため、これは不可能です。
.NET dll に tlbexp を使用できることがわかりました: http://msdn.microsoft.com/en-us/library/hfzzah2c(v=vs.80).aspx
おそらく失敗することを知っていたので、これを試してみました(COM .dllがあるため)。このエラーを受け取りました:
TlbExp : エラー TX0000 : ファイルまたはアセンブリ 'file:///C:\Windows\system32\ResipBcb.dll' またはその依存関係の 1 つを読み込めませんでした。モジュールには、アセンブリ マニフェストが含まれている必要がありました。
Dependency Walker を使用すると、2 つの .dll が欠落していることに気付きました。ieshims.dll をオンラインで見つけましたが、wer.dll が見つかりません。この質問を参照してください。
tlbexp の失敗が、欠落しているこのファイルと関係があるかどうかわかりませんか?
要約すると、私の質問は次のとおりです。この .dll から .tlb を取得するにはどうすればよいですか? この COM .dll から .tlb を抽出する方法が見つからないようです。
よろしくお願いします
クリント・キャンビア
c# - COMクラスの可視性:C#からVB6
私は一方ではC#.Net 4.0アプリケーションを、もう一方ではVB6アプリを持っています。プロジェクトCOMを表示し、アクティブ化されたレジスタCOM相互運用機能を作成して、COMインターフェイスを作成しました。
新しいtlbファイルをインポートするC#アプリケーションを実装して、COMインターフェイスをテストしました。すべてが順調のようです。
次のステップとして、vb6でdllを使用しようとしました。dllをロードできましたが、すべてのパブリッククラスを表示できなくなりました。C#では、vb6で4つのクラスが表示されますが、表示できるのは3つだけです。
私が見ることができないクラスは「特別な」クラスです。これは、インターフェイスを構成し、イベントを提供するためです。
クラスはでマークされています
COMEventsインターフェースは次のようなものです
私はすべてがうまくいったと言わなければなりません。COMインターフェイスプロジェクトによって実行時にロードされる他のアセンブリにのみ影響するプロジェクトを追加しました。それらは変更されたインターフェースを実装します。これは、comインターフェイスに加えた唯一の変更は、メソッドに追加のパラメーターを追加することです。
クラスが表示されなくなったのはなぜですか?そして、なぜそれは私が変更したクラスだけで、「危険な」方法ではないのですか?
助けが必要ですありがとう!
PS:今まで試しました:->すべてのプロジェクトはビルドx86です->プロジェクトビルドはx86マシン上にあります->ディペンデンシーウォーカー(GPSVC.DLLとIESHIMS.DLLはありませんが、以前にもありました。効果により、tlbがビルドされ、ロードされる可能性があります)-> tlbexp.exeを試行しましたが、依存関係エラーが発生しました。assamblyランタイムが現在のものよりも新しいためです。wtf?)
c# - TlbExp.exe エラー: このアセンブリは、より新しいランタイムによってビルドされています
サーバーの一部を .net 4.0 に移行しています。最初のステップとして Vs2010 への移行は既に行いましたが、どのプロジェクトのターゲット フレームワークも変更していません。
2 番目のステップとして、サーバーの特定の部分をターゲット 4.0 に移動して、新しい機能の一部を使用できるようにします。
4.0 を対象とするクラス ライブラリ DLL で TLBexp.exe を呼び出すときに問題が発生しました。この DLL は、2.0 を対象とする多くの DLL も参照しています。
次のエラーが表示されます: TlbExp : エラー TX0000: ファイルまたはアセンブリ 'file:Library.dll' またはその依存関係の 1 つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。
付属の TLBExp を呼び出しています: Microsoft SDKs\Windows\v7.0A\bin\ VS2010 コマンド プロンプトで呼び出すコマンドで、v4.0.30319 バイナリ (mscorlib.tlb など) を参照します。
2.0 ライブラリを参照する 4.0 DLL で TLB を実行することは許可されていますか? はいの場合、このエラーが発生する理由は何か。
私が使用する正確なコマンド コールは次のとおりです。 v4.0.30319\mscorlib.tlb" /tlbreference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.tlb" /tlbreference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ System.Windows.Forms.tlb" /tlbreference:"C:\Windows\system32\stdole2.tlb" C:\Dev\Library.dll
ありがとう
.net - System.Runtime.InteropServices.ClassInterfaceType 列挙に AutoUnknown 値がないのはなぜですか?
.NETのSystem.Runtime.InteropServices.ClassInterfaceType列挙にはAutoDispatch
値と値AutoDual
がありますが、値はありませんAutoUnknown
。なぜそうしないのですか? また、車輪を再発明する必要がないように、それを達成するためのかなり自動化された方法を誰かがすでに考え出していますか?
もう少し背景として、現在の列挙型の 3 つの値とその機能を次に示します。
ClassInterfaceType.None
はクラス インターフェイスを作成しません。これは Microsoft の推奨値です。クラス インターフェイスがない場合は、意図するメンバーを使用して独自のインターフェイスを作成し、クラスにそれを実装させる必要があります。次に、インターフェイスでSystem.Runtime.InteropServices.ClassInterfaceAttribute属性を使用して、インターフェイスをディスパッチ インターフェイス (レイト バインド クライアントをサポート)、不明なインターフェイス (アーリー バインド クライアントをサポート)、またはデュアル (アーリー バインド クライアントとレイト バインド クライアントの両方をサポート) にすることができます。ClassInterfaceType.AutoDispatch
IDispatch
明示的なメンバーなしでから派生したクラス インターフェイスを作成します。明示的なメンバーがない場合、遅延バインディングの呼び出し元のみをサポートできます。ClassInterfaceType.AutoDual
から派生したクラス インターフェイスを作成します。このインターフェイスは、IDispatch
そのクラスのすべてのパブリック非静的メンバーの明示的なメンバーと、その基本クラスおよび実装されたインターフェイスのすべてのメンバーを持ちます。クラスのメンバーのいずれかが変更されると、クラス インターフェイスも変更されるという事実から生じる「バージョン管理の制限のため」、Microsoft はこの値の使用を強くお勧めしません。(そのため、クラスが変更された後に再バインドしない呼び出し元は、間違ったメソッドを呼び出したり、間違ったパラメーターを渡したりする可能性があります。)
だから私が疑問に思っているのは、クラスのメンバーを明示的に宣言するClassInterfaceType.AutoUnknown
派生クラスインターフェイスを作成する値が呼び出されない理由ですIUnknown
(基本クラスまたはそれが実装する他のインターフェイスではありません)。
私たちがClassInterfaceType.AutoDualDirect
それに取り組んでいる間、基本クラスのすべてのメンバーと実装されたすべてのインターフェイスを公開する代わりに、他のメンバーができるため、クラスの直接のメンバーのみを公開することを除いて、AutoDual に似たようなものがあることも期待できます。他の COM インターフェイスを介して取得できます。
それで、ここでの話は何ですか、何が欠けていますか?Microsoft が AutoDual を使用しないことを推奨していると言っているのは知っています。「バージョン管理の問題」があるからです。これらの懸念は AutoUnknown にもある程度当てはまります。しかし、その推奨にもかかわらず、彼らはまだAutoDualを持っています。彼らはなぜ AutoUnknown も持っていないのでしょうか?
これらの「バージョン管理の課題」について一言: これらの懸念事項の最も危険な側面は、遅延バインディングの呼び出し元にのみ適用されます。AutoUnknown は、派生IUnknown
インターフェイスではなく、派生インターフェイスを生成するため、事前IDispatch
にバインドされたクライアントが持つ可能性のあるバージョン管理の問題だけを気にする必要があります。また、自動生成されたクラス インターフェイスの IID は、クラスの public 非 static メンバーが変更されるたびに変更されるため、事前にバインドされたクライアントは既存のメンバーに対して「不適切な呼び出し」を行うことができず、単純に QueryInterface( ) クラス インターフェイスの場合。まだ失敗ですが、クラッシュなどではなく、管理可能なものです。これは、インターフェイスの変更を決して許可しないという COM の規則を破るものではありません。変わるのではなく、新しいインターフェース (新しい IID) になりつつあります。それはそう、IUnknown
AutoDual メカニズムの半分 (派生メンバーを除く)。実際、AutoDual にはレイト バウンドの課題もすべて含まれているため、AutoDual よりも「バージョン管理の課題」が少なくなります。
繰り返しますが、AutoUnknown が存在しないのに、なぜ AutoDual が存在するのでしょうか。
実際の例をいくつか示すために、次の C# コードを検討してください。
次の idl を生成します。
それは問題ありませんが、代わりに AutoUnknown がこの idl を生成することをお勧めします。
これを自動的に行う方法がない場合は、リフレクションを使用してそれを行うものを作成する予定です。そのため、その面での推奨事項もいただければ幸いです。たとえば、メソッドで確認する必要がある属性はありますか? パラメータについて?私はそれがどのように機能するかを確認するために IL を掘り下げましたSystem.Runtime.InteropServices.TypeLibConverter
が、残念ながらすべての機能は、私が取得できないプライベート internalcall nConvertAssemblyToTypeLib() 関数にあります。
ありがとう!
c# - 名前が返されるデータ型と同じ場合、プロパティの名前が変更されます
次の問題に直面しています。
私のインターフェイスは C# で定義されています。インターフェイスでカスタム列挙型を使用しています。一部の列挙型は、それらが返すデータ型と同じ名前を持っています。例:
C++ でモジュールを使用するには、tlbexp を使用します。データ型と名前を共有するプロパティの名前は、"Name" から "_Name" に変更されます。
Bar myEnumValue = pFoo->Bar // 存在しません
Bar myEnumValue = pFoo->_Bar // は私の 'Bar' プロパティです
これまでのところ、その理由と、これを防ぐことができるかどうか、またはその方法についてのドキュメントは見つかりませんでした。ビルドまたはエクスポート中に警告が表示されません。モジュールを直感的に使用するために、プロパティまたは列挙型の名前を変更したくありません。
なぜこれが起こるのか誰にも説明できますか?
c++ - .exe から .tlb を抽出するにはどうすればよいですか
使用したい COM アプリケーションがありますが、そのアプリケーションの .exe しかありません。その .exe から .tlb を抽出する方法はありますか? Visual Studio コマンド プロンプトから試してみましtlbexp filename.exe
たが、エラーが発生し、理由がわかりませんTlbExp : error TX0000 : Exception of type 'System.OutOfMemoryException' was thrown.
。C++ で Visual Studio 2012 を使用しています。
編集:
.exe は C++ ですが、後で tlbexp が .NET 用であることがわかりました。これがうまくいかなかった理由です。混乱して申し訳ありません。C++ .exe から .tlb を抽出する方法を見つける必要があります。