問題タブ [com-interop]
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# - COM 相互運用機能は、アセンブリの読み込みで .NET AppDomain 境界を尊重しますか?
核となる問題は次のとおりです。別の AppDomain でCOM 相互運用機能を使用する .NET アプリケーションがあります。COM スタッフは、COM スタッフが呼び出されている AppDomain ではなく、アセンブリをデフォルト ドメインにロードしているようです。
私が知りたいのは、これは予想される動作ですか、それとも、これらの COM 関連のアセンブリが間違った AppDomain に読み込まれるようにするために何か間違ったことをしているのですか? 以下の状況の詳細な説明を参照してください...
アプリケーションは 3 つのアセンブリで構成されています。 - アプリケーションのエントリ ポイントであるメイン EXE。- インターフェイス IController (IPlugin スタイル) のみを含む common.dll - IController および MarshalByRefObject を実装する Controller クラスを含む controller.dll。このクラスはすべての作業を行い、COM 相互運用機能を使用して別のアプリケーションと対話します。
メイン EXE の関連部分は次のようになります。
common.dll には、次の 2 つだけが含まれています。
そして、controller.dll には次のクラスが含まれています (COM 相互運用機能も呼び出します)。
アプリケーションを最初に実行すると、Assembly.GetAssemblies() は予想どおりに表示され、common.dll は両方の AppDomains に読み込まれ、controller.dll はコントローラー ドメインにのみ読み込まれます。ただし、c.Run() を呼び出した後、COM 相互運用機能に関連するアセンブリがデフォルトの AppDomain に読み込まれ、COM 相互運用が行われている AppDomain には読み込まれていないことがわかります。
なぜこれが起こっているのでしょうか?
興味がある場合は、ここに少し背景があります。
もともと、これは 1 AppDomain アプリケーションでした。それがインターフェースするCOMのものは、長期間使用すると安定しないサーバーAPIです。COM から COMException (その原因に関する有用な診断情報がない) が発生した場合、COM 接続が再び機能する前に、アプリケーション全体を再起動する必要があります。COM アプリケーション サーバーに再接続するだけで、再びすぐに COM 例外が発生します。これに対処するために、COM 相互運用機能を別の AppDomain に移動しようとしました。これにより、謎の COMExceptions が発生したときに、それが発生した AppDomain をアンロードし、新しいものを作成して、アプリケーションを手動で再起動することなく、最初からやり直すことができます。 . とにかくそれが理論でした...
c# - .NET相互運用機能:現在のディレクトリのアセンブリを使用する
VB6からの.NETアセンブリを、GACに配置せずに、またregasm.exeの/ codebase引数を使用せずに、相互運用機能を介して使用しようとしています。
私が理解していることから、.NETクラスライブラリでregasm.exeを実行すると、クラスライブラリ内の各クラスのレジストリエントリが作成され、COMクライアントに.NETオブジェクトをラップするプロキシとして機能するmscoree.dllをロードするように指示されます。 COMの使用。Mscoree.dllは、クラスのレジストリ内のInprocServer32 / Assemblyキーを使用して、クラスの実装が含まれているクラスライブラリを判別します。
regasm.exeで/codebaseを使用するか、クラスライブラリをGACに配置すると、すべてが正常に機能します。しかし、散在するドキュメントから理解できる限り、mscoree.dllは、現在のディレクトリと、/ codebaseが使用されていない場合はパスでアセンブリを探す必要があります(したがって、レジストリにCodeBaseエントリがありません。クラス)そしてそれはGACでそれを見つけることができません。
C#コードは、次のように単純です。
そして、問題は、コンパイルされたDLLと同じディレクトリに置いたVBScript1ライナーで再現されます。
ここで何が欠けていますか?mscoree.dllがどこかでアセンブリを検索する方法の明確な説明はありますか?
ところで、私は.NET 2.0を使用していますが、そうです、アセンブリをGACに配置する必要があることはわかっています。なぜ、これが宣伝どおりに機能しないのか疑問に思っています。
java - JSP ページから COM オブジェクトをロードするにはどうすればよいですか?
JSP アプリケーションを開発していて、COM オブジェクトをロードする必要があります。そのようなことができるでしょうか?
はいの場合、どのように?
.net - COMException: システム コールに渡されたデータ領域が小さすぎます
この投稿のタイトルで定義されているメッセージと HResult 0x8007007A は、Windows Workflow Foundation ランタイムのインスタンスの作成中に発生することがあります。
エラー テキストは一目瞭然で、Workflow Foundation アセンブリに Reflector を使用することで、ADVAPI32.DLL 内の次の呼び出しのいずれかに問題を絞り込みました。
SetKernelObjectSecurity RevertToSelf OpenProcessToken GetKernelObjectSecurity
RevertToSelf() は入力パラメーターを必要としないため、削除しました。小さすぎるデータ構造を渡すことはできません。
GetKernelObjectSecurity は入力として構造体を受け取ります。これはおそらく間違っている可能性がありますが、このエラーは一時的なものであり、明らかな再現手順はありません。
アプリのどこかでメモリ管理に関係していると感じていると思いますが、HResult が何を意味するかについての適切な定義を突き止めることはできません。この HResult の適切な定義の方向性を教えてもらえますか?
c# - COM+ (VB) でカスタム .Net 例外を処理しますか?
VB COM+ サービスから呼び出される .Net コンポーネントの作成を開始しようとしています (新しいコンポーネントは、Web サービスを呼び出し、応答に基づいて戻る DLL です)。呼び出し元の VB の .Net コードで発生する可能性のあるエラー状態を処理する方法がわかりません。
私が心配している2種類のエラーは次のとおりです。
- 前提条件が満たされない場合にスローしたい例外 (たとえば、パラメーターとして指定された開始日が、パラメーターとして指定された終了日から 3 か月以内である場合。StartDateNotValidException をスローしたい場合があります)
- Web サービス呼び出しの一部として発生する可能性が高い例外 (タイムアウト、404 など)。
これらのいずれかが発生した場合、特定のフィードバックをユーザーに返したり、ログに情報を記録したりしたいと思います。.Net コードから Int リターン コードを返し、例外を回避することを考えていましたが、呼び出し元の VB コードが最終的に .Net に移行される可能性があるため、可能であれば例外を使用したいと考えています。
COM Interop が標準ライブラリの例外を HRESULT に自動的に変換することをMSDNで読みました。誰もこれを使用した経験がありますか? これを使用して、カスタム .Net 例外を、VB で処理できるエラー状態に変換できますか?
ありがとう、ニック
.net - COM オブジェクトの ActiveD または MSXML2 が参照されている場合のビルド警告の多く
プロジェクトを .NET 1.1 から .NET 2.0 に移動した後、MsBuild は一部の COM オブジェクトに対して多くの警告を発します。
テスト用のサンプル コード (実際のコードは重要ではありません。警告を作成するために使用されるだけです):
警告メッセージは次のようになります
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets: 警告: 'ITypeLib.RemoteGetLibAttr' の少なくとも 1 つの引数をランタイム マーシャラーでマーシャリングできません。したがって、このような引数はポインターとして渡され、操作には安全でないコードが必要になる場合があります。
所見:
- ActiveDs (11 個の警告) および MSXML2 (54 個の警告) で発生します。
- 独自の COM オブジェクトでは見られません。
<Reference>
.csproj ファイルのエントリに属性が含まれていますWrapperTool = "tlbimp"
- すべての警告にもかかわらず、実行中のシステムで問題は観察されていません。
警告を取り除く方法はありますか?
.net - COM Interop のジェネリック コレクションに代わるものは何ですか?
COM 相互運用機能を介して ASP によって消費される .NET アセンブリから部門のコレクションを返そうとしています。.NET を使用すると、たとえば、ジェネリック コレクションを返すだけList<Department>
ですが、ジェネリックは COM Interop ではうまく機能しないようです。それで、私のオプションは何ですか?
リストを反復処理し、インデックスでアイテムにアクセスできるようにしたいと思います。から継承するか、 、または別のインターフェイスをList<Department>
実装する必要がありますか、それともより良い方法がありますか? 理想的には、必要なすべてのタイプのリストに対してカスタム コレクションを実装する必要はありません。また、COM Interop でも動作しますか?IList
IList<Department>
List[index]
ありがとう、マイク
.NET コンポーネントの例 (C#):
ASP コードの例:
関連する質問:
c# - .Net-関数で参照されているときにロードに15秒かかる相互運用機能アセンブリ
これはC#コンソールアプリケーションです。私はこのようなことをする関数を持っています:
それがすべてです。呼び出されると、関数がヒットするまでに15秒の遅延があります。私はこのようなものを追加しました:
これは、foo関数がヒットする約10ミリ秒前に相互運用機能アセンブリがロードされたことを通知して起動します。これについて私は何ができますか?プログラムはこの関数を一度呼び出して(そして最終的には何か他のことをする)、それから終了する必要があるので、これらのアセンブリをキャッシュするか何かをする必要があります。アイデア?
c# - .Net Interop を使用して Excel から DateTime 値を取得するときにミリ秒が欠落する
.Net COM Interopを使用して DateTime 値を Excel セルに入力しRange.set_value
、.Net COM Interop を使用して同じセルの値を取得すると、値Range.get_value
のミリ秒部分は返されませんが、それ以外はすべて正しいです。
これはバグですか?
回避策は何ですか? 代わりに Value2 プロパティを使用すると役立つと思います。他の誰かがこれを試しましたか?
c# - COM Interop を介してインデクサー / デフォルト プロパティを公開する
コンポーネントのインデクサー (別名既定のプロパティ) にアクセスできる従来の ASP で使用されるコンポーネントを C# で記述しようとしています。
例:
C# コンポーネント:
ASP コンシューマー:
設定する必要がある属性はありますか、インターフェイスを実装する必要がありますか、それとも何か他のことをする必要がありますか? または、これは COM Interop 経由では不可能ですか?
目的は、これらの既定のプロパティ ( などRequest.QueryString("key")
) を使用してコレクションを利用する、Request などの組み込み ASP オブジェクトの一部のテスト ダブルを作成しようとすることです。代替提案は大歓迎です。
更新: フォローアップの質問をしました: VBScript から .NET コンポーネントのインデクサーに常にアクセスできるとは限らないのはなぜですか?