問題タブ [regasm]
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 - COM 相互運用 (CCW) でのオーバーロード - IDispatch 名にサフィックス (_2、_3 など) が含まれる
いくつかのクラスを含むマネージ アセンブリがあり、それらのクラスにはオーバーロードされたメソッドがあります。アセンブリを COM/IDispatch 呼び出し元に公開します
..また、アセンブリ自体に適切な Guid を設定します。COM 相互運用のための明示的なインターフェイスは定義しません。すべて動的に行われます。regasm.exe /codebase
マネージ DLL で実行すると、COM 相互運用に登録されます。
OleView を実行すると、アセンブリ内のさまざまなクラスの ProgId を確認できます。しかし、これらの ProgId を参照し、IDispatch ノードを展開すると、これらのクラスの TypeLib 情報がありません。
それでも、スクリプトから、引数を 0 個受け取るメソッドまたは 1 個の引数を受け取るメソッドを呼び出すことができます。複数の引数を受け入れるオーバーロードもある場合、そのメソッドを名前で呼び出すことはできません。私が一貫して得るエラーは
このことから、COM/IDispatch クライアントは、COM 相互運用機能を介して公開されたオブジェクトのオーバーロードされたメソッドを適切に解決できないことがわかりました。
それから私は追加しました
...問題の各クラスに。DLL の実行後regasm.exe
、IDispatch ノードの下に各メソッドの typelib 情報が表示されます。
私が見つけたのは、オーバーロードされたメソッドは、追加されたサフィックスを含む名前を自動的に取得するということです。MethodX は、自動生成された typelib アセンブリのオーバーロードを MethodX、MethodX_2、MethodX_3 などとして公開します。
そして、これらの接尾辞を使用してメソッド名を参照することで、オーバーロードされたメソッドを呼び出すことができることがわかりました。ただし、一般的な名前ではありません。
さらに興味深いことに、[ClassInterface(ClassInterfaceType.AutoDual)]
クラスからを削除した場合でも、オーバーロードされたメソッドをこの方法で呼び出すことができ、 Wrong number of arguments or invalid property assignment
エラーを回避できました。
私の質問は: この動作 - メンバー名に数字の接尾辞を追加する - は安定していますか? 文書化されていますか?信頼できる?
excel - COM Callable Wrapper から間違ったオブジェクトが返される
Powerpoint 内の VBA から呼び出される dll を更新しました。開発はすべてうまくいきましたが、別のユーザーのマシンにデプロイしようとすると、デバッグ方法がわからないという問題が発生します。
何が起こるかというと、VBA で .Net オブジェクトが作成されると、返される参照が間違ったオブジェクトへのものであるため、次の行はメソッドが見つからないというエラーになります。
最後の行は、実行時エラー '438' Object does not support this property or methodで失敗します。これは、myObj の型が「Foo.Bar」ではなく「Wrong.Type」であることが原因です。
「Wrong.Type」もアセンブリに含まれているため、タイプ ライブラリに問題があると思われますが、( regasm /codebase /tlb MyLib.dll を使用して) 再生成を試みましたが、これは役に立ちませんでした。
これ以上診断する方法がわかりません。うまくいけば、誰かがこの種の問題を診断する方法についていくつかの手順をリストできますか?
c# - COM: OLE Viewer がクラスのインスタンスを作成できません
OLE/COM ビューアーを使用すると、次のエラーが表示されます (登録したクラスを展開するとき)
COM クラスは RegAsm に登録されている C# クラスです。
このエラーはどういう意味ですか?
編集:
同様の問題については、 http://www.dotnet247.com/247reference/msgs/24/124704.aspxを参照してください。
c# - RegasmとComInteropの偽陰性
COMを介してライブラリを公開しようとしていますが、実際の問題よりもツールと戦っているようです。COM公開クラスの記述方法に関係なく、「XXX.dllにはCOM相互運用機能に登録できるタイプが含まれていません」(プロジェクトのプロパティでプロジェクトをCOM相互運用機能に登録としてマーク)と表示されます。以下の単純なクラス(ComVisible(false)で署名およびマークされているアセンブリ内の唯一のクラスとして)でも、警告が持続します。
「タイプが正常に登録されました」と喜んで表示される出力のコマンドラインからregasmを実行しようとしました。ただし、/ verboseスイッチを指定して実行すると、追加情報は表示されません(名前または登録されているタイプの数だけがリストされていることを思い出しているようです)。また、/ regfileスイッチを使用してregasmを実行し、これを生成するregfileを生成してみました。
私はCOMウィザードではありませんが、登録は有効に見えます。ただし、アセンブリでregasmを実行すると、レジストリに何も表示されないようです。
だから私の質問は、登録を機能させるための簡単な例に何かが欠けているかどうか、誤った表示が表示されているかどうか、登録は実際に正しいかどうか、そしてCOM登録が実際に機能するかどうかをより適切に判断するにはどうすればよいですか?
編集:Kevによって提案された変更を使用して、VS2008からの警告を回避することはできませんでしたが、実際にはregasmを直接使用してレジストリに登録されたものを取得できました(VS2008統合だけのレジストリには何もありません)。
次に、単純なクラスを削除しようとしたため、アセンブリが空になりました。これでregasmを実行しても、「タイプは正常に登録されました」という警告のみが報告されました。COMに誤って公開されている可能性のある他のアセンブリの一部でRegAsmを実行すると、「RegAsm:警告RA0000:タイプが登録されていません」などの警告が表示されます。ここで何が起こっているのですか、レジストリ以外のものを信頼できますか?また、レガスムからのオン/オフ警告はどうですか?
.net - WinFormユーザーコントロールをCOMサーバーとして登録する
WinFormユーザーコントロールをCOMサーバーとして登録して、MFCアプリケーションで使用できるようにしようとしています。winformコントロールはC++/ CLIで記述されており、管理されていないネイティブdllを使用します。.netのすばらしい相互運用サービスを利用して、このユーザーコントロールをCOMサーバーとして登録したいと思います。
MSDNは、自分がしていることを達成するためにregasmを使用できると言ったので、先に進んで登録しました
レジストリエントリも生成しました
そしてそれを私のレジストリとマージしました
この時点で、ツールボックスの[アイテム]を選択すると、このコントロールがCOMコンポーネントに表示されることを期待していました。しかし、それはそこに現れていません。これは予想される動作ですか?はいの場合、ActiveXコントロール(Javaなど)を使用する言語については、MFCアプリケーションでこのコントロールをどのように使用しますか。
c# - C#COM相互運用ライブラリ
現在、レガシーVBAアプリケーションを.Netアプリケーションに移植しています。このプロセス中に、既存のVBAアプリケーションのユーザーはいくつかの機能を追加する必要があります。したがって、VBAでコーディングしてからC#でコーディングする代わりに、C#で新しい機能を記述しました。これを、COMを介して既存のVBAアプリケーションに公開し、現在の.Netアプリケーションバージョンでも保持したいと考えています。
このソリューションには、UI用の1つのプロジェクト、ビジネスロジック用の1つのプロジェクト、データアクセス層用の1つのプロジェクトの、いくつかのプロジェクトが含まれています。
新機能は、データを変更するためのいくつかの新しいフォームです。したがって、理想的には、COM相互運用機能を介してこれらのC#フォームをランチするアクセスでフォームコマンドボタンをクリックします。
COM相互運用機能を介してこのフォームを公開するにはどうすればよいですか。私が望んでいたのは、必要なフォームを起動するためのアクセス方法を公開するために、インターフェイスICOMManagerを含む別のプロジェクトMyProject.COMを追加することでした。COMManagerクラスは、.netアプリケーションで必要なフォームをインスタンス化し、それらを表示します。このプロジェクトMyProject.COMには、UIレイヤーとビジネスロジックレイヤーへの参照があります。
REGASMを使用してこのプロジェクトを登録したい場合、これらの他のプロジェクトへの参照をどのように含めますか?
これを行う方法についてのヘルプやアドバイスをありがとう。
com - .NET / COMは、Regasmを介して登録された複数のバージョンでどのように機能しますか?
私は.NETDLLを持っています(それはたまたまC ++ / CLIで書かれています)。その一部をCOM経由で公開したい。これを行い、「regasm my.dll/codebase」を使用して登録します。ここまでは順調ですね。しかし、その後、いくつかの変更を行い、アセンブリのバージョン番号を変更し、さらにdllを別のフォルダーに移動します。再度登録して、OLE /COMViewerでCOMオブジェクトを確認します。私はこのようなものを見ます
複数のバージョンに関する質問:
したがって、最後に登録されたCOMオブジェクトが優先されると思います。古い7.0.0.0COMオブジェクトを登録しているかどうかは関係ありません。7.0.0.27397は、最後に登録したため、COMオブジェクトをインスタンス化したときに作成されるオブジェクトです。あれは正しいですか?
おっと、私は7.0.0.0オブジェクトの周りを維持しませんでした。それを取り除く方法はありますか?レジストリにアクセスして手動で操作する以外に、COMオブジェクトのすべてのバージョンを削除する方法はありますか?
好奇心から、COMオブジェクトの特定のバージョンを具体的にインスタンス化したい場合、それを行う方法はありますか?(コード例を示したい場合は、C ++を使用しています)。
バージョン番号を保存しないようにregasmに指示する方法はありますか。それは、物事が雑然としているように見え、利点が何であるかがわからないためです。COMオブジェクトでAPIが大幅に変更された場合は、GUIDとprogidを変更するだけですよね?複数のバージョンを登録したくない場合はどうなりますか(登録しません)。
c# - vbscript から C# コードを呼び出せません - ActiveX エラー
C# で記述したメソッドを VBScript から呼び出そうとしています。
Web で見つけることができるほぼすべての指示に従いましたが、まだ問題が発生しています。
具体的には私は得ています
エラー: ActiveX コンポーネントはオブジェクトを作成できません
コード: 800A01AD
これまでのところ、次のことを行っています。
- 設定
ComVisible(true)
- を使用して登録
regasm /codebase
- 私のアセンブリにStrongという名前を付けました
- レジストリにあり、正しい場所を指していることを確認しました
- クラスを公開しました
- 静的メソッドがない
- 呼び出したいメソッドを公開しました
- パラメータなしのコンストラクタを持つ
- GUID を明示的に定義
私の VBScript は次のようになります。
私のC#コードは次のようになります:
誰でも助けることができますか?
com+ - regasmが使用される場合、COM +コンポーネントはどのアカウントで実行されますか?
regasmツールを介して登録した場合、COM +コンポーネントはどのアカウントで実行されますか?アカウントを識別するためのregasmのコマンドパラメータに気づきませんでした。regasmを実行するには管理者権限が必要ですが、COM +コンポーネントも管理者権限で実行されると思いますか?