問題タブ [rcw]
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 オブジェクトの参照カウント > 1 を保持するのはいつですか?
最近まで、.NET ランタイムは、ランタイム呼び出し可能ラッパーを作成するときに COM オブジェクトの参照カウントを 1 だけ増加させ、特定の COM オブジェクトに対してそのようなランタイム呼び出し可能ラッパーを 1 つだけ作成すると信じていました。
私が間違っていなければ、上記はMarshal.FinalReleaseComObjectとMarshal.ReleaseComObjectが実際には同じことを行うことを意味します。
ただし、今日、COM オブジェクトがコードによって適切に解放されることを確認するためのテストを作成していました。これを行うには、リリースされたと思われるオブジェクトを呼び出し、期待されるInvalidComObjectException
. の後に例外がスローされ、 の後に例外がスローされない場合があることが判明しましFinalReleaseComObject
たReleaseComObject
。
これは、.NET 2.0 ランタイムが COM オブジェクトへの複数の参照を保持できるということですか? もしそうなら、いつこれをしますか?
c# - このアンマネージコードをaspからasp.net2/ mvcに転送するにはどうすればよいですか?
私はASP.net相互運用機能の初心者なので、ここにあるのは、asp.netmvcアプリから呼び出す必要のあるアンマネージdllです。
dll名はCTSerialNumChecksum.dllです。以下の2行だけを使用して、信頼できる応答からaspからdllを簡単に呼び出すことができます。すべてが正常に機能していることを書いてください。
dllへの参照を追加しようとすると機能しないため、管理されていないことがわかります。相互運用とマーシャリングに関するいくつかのチュートリアルに従おうとしていますが、これまでのところ、コードを機能させることができませんでした。
オブジェクトを別の静的クラスにラップして、アプリの残りの部分にコードを呼び出させようとしています。なぜasp.netで動作させるのが難しいのか、それとも私がばかげたarggghhhなのかわからない。
質問:
- クラスを書くにはどうすればよいですか?私が見つけたほとんどの例は、クラス、.CRC32API部分を含んでいませんでした、そして、それらは非常に難しいようです
- また、特定のファイルがどのタイプのdllであるか、つまりアンマネージC ++などを識別するためにどのツールを使用できますか?
- また、後でjqueryを使用してajax呼び出しを実行し、これを使用してフォームの事前送信を検証できるようにする予定です。これを処理するためのより良い方法はありますか?
Dumpbin呼び出しでこれが返されましたが、内部に検証関数名が表示されない理由がわかりません。
更新:
これは名前のマングリングが原因でしょうか?それはc++dllなので、少なくとも私が疑うものはとにかく...
com - COM RCW の Addref
不明なインターフェイスで RCW 参照カウントを増やすことはできますか? (つまり、基になる COM オブジェクトの参照カウントではありません)
古い COM サーバー コードがあります。
このコードは問題なく動作しますが、別のメソッドから呼び出す必要があります。
comobject のタイプはさまざまです (それがオブジェクトである理由です)。
visual-studio-2010 - VS2010 はプロジェクト プロパティ (「基になる RCW」) を表示しませんか?
プロジェクト (さまざまな種類のプロジェクト) を右クリックして "プロパティ":
通常、VS2010 を再起動した後、プロジェクト ページを表示できます。RTM版を使用しています。
このエラーの原因は何ですか?
c# - C# で COM 相互運用機能を使用する場合の RCW と参照カウント
Office 相互運用アセンブリを使用するアプリケーションがあります。ランタイムによって管理される「Runtime Callable Wrapper (RCW)」について認識しています。しかし、参照カウントがどのようにインクリメントされるかはよくわかりません。MSDN によると、
RCW は、それを呼び出すマネージ クライアントの数に関係なく、ラップされた COM オブジェクトへの参照を 1 つだけ保持します。
私が正しく理解している場合、次の例では、
wrd
インスタンスを別のメソッドに渡しています。しかし、これは内部参照カウントをインクリメントしません。では、参照カウントがインクリメントされるシナリオについて疑問に思っていますか? 参照カウントがインクリメントされるシナリオを指摘できる人はいますか?
また、COM オブジェクトを使用してプログラミングするときは二重ドットを使用しないというブログを読みました。のようなものwrd.ActiveDocument.ActiveWindow
。著者は、参照カウンターをインクリメントする値を保持するために、コンパイラーが個別の変数を作成すると主張しています。私見、これは間違っており、最初の例がこれを証明しています。あれは正しいですか?
どんな助けでも素晴らしいでしょう!
c# - COM オブジェクトはその RCW から分離されていますか?
「基礎となるRCWから分離されたCOMオブジェクトは使用できません」というエラーの問題を修正しようとしています.COMオブジェクトがインスタンス化されていないスレッドで使用されていることが原因だと思います.
私は多くのリファクタリングを行うことを許可されていません。オブジェクトは複数のスレッドで使用できる必要があるため、前述のエラーを引き起こす何かを行う前に、現在のスレッドでオブジェクトが作成されているかどうかを確認する方法があるかどうか疑問に思います。まだ作成していない場合は作成します。
また、私はこの相互運用のことは初めてなので、誰かが私を理解するのに十分親切であれば、私はそれを大いに感謝します:
スレッドが終了すると、COM オブジェクトはどうなりますか? また、もう一方のスレッドに COM オブジェクトがなくても RCW を使用できるのはなぜですか (なぜ null ではないのですか?)。また、なぜそのエラーが発生し、同時に Marshal.IsCOMObject で true を返すのでしょうか?
参照カウント、ラッパー、およびメモリを使用した次のシナリオで何が起こるか:
- スレッド A に COM オブジェクト x を作成する
- それを渡し、スレッド B に保存します
- スレッド C に別の x を作成します (または、y の場合はどうなるでしょうか?)
- それを渡し、スレッド B に x を上書きします
c# - WPFを使用した終了時のCOM例外
次の両方のテストケースを実行すると、COMの実行がコンソールに出力されます。私は何が間違っているのですか?
いずれかのテストを単独で実行する場合、または両方のテストを一緒に実行する場合、例外はコンソールに1回だけ書き込まれます。これにより、クリーンアップしていないAppDomainごとのリソースがあるのではないかと思われます。
NUnitとMSTestを使用してテストを試しましたが、両方の環境で同じ動作をしました。(実際、MSTestで両方のテストを実行すると、1つまたは2つの例外が出力されるかどうかはわかりません。)
例外:
テストコード:
.net - COM文字列(BSTR)と.NET文字列の違いは何ですか?
データを「エンコード」するためにバイトを組み合わせる方法だけですか?
RCWが自動的に.NET文字列を取得し、それをCOMBSTRに変換する方法を知りたいのですが。.NET文字列から変換された有効なCOMBSTRを形成するだけだと思います。
関連:.NETのバイトタイプを使用して独自の有効なBSTRを構築できますか?
com - .Net の RCW COM オブジェクト作成パラメーター (つまり、要求されたインターフェイス) を管理する方法は?
C# .NET アプリケーションで外部のネイティブ COM コンポーネントを使用しています。
この COM DLL にはタイプ ライブラリがないため、相互運用コードを自分で作成する必要があり、TlbImp のように include/idl ファイルを作成しました。しかし、最悪のことは、オブジェクトの作成が次のように失敗することです。
ネイティブを使用し、実装されたインターフェイス IID の 1 つをCoCreateInstance
指定すると、最終的にクラスが作成されます。class_id
結局のところ、問題は COM オブジェクトがパラメーターとして渡されたIClassFactory::CreateInstance
ものをサポートしていないため、返されることにあります(逆アセンブラーとデバッガーで特定しました)。コンポーネントは MS SQL VDI です。IID_IUnknown
riid
CLASS_E_CLASSNOTAVAILABLE
CreateInstance
.NET RCW に別のインターフェイス ID をメソッドに渡すよう強制する方法はありIID_IUnknown
ますか? 私はネットをたくさん検索しましたが、これに対する解決策は見つかりませんでした。
回避策として、現在は C++/CLI を使用してオブジェクトを作成し、IID_IUnknown
この目的ではなく適切なインターフェイスを要求しています。しかし、C++/CLI ではプラットフォームごとに異なる DLL をビルドする必要があるため、C# でコードを作成したいと考えています。
ありがとう
c# - COM オブジェクトが RCW から切断されたときに処理する方法はありますか?
COM オブジェクトが RCW から切断されようとしているときにコードを実行する方法はありますか?
以下のコードは機能しません。プログラムが Finalize サブに入ると、ExcelApplication は既に RCW から切断されており、エラーが発生します。原因はわかりましたが、解決策を知りたいです。
次のように動作させたい: 最後のマネージ参照が解放されると、COM オブジェクトが切断される前に Finalize サブからのコードが実行されます。
私の質問は - それはまったく可能ですか?そうであれば、Finalizeを外部から明示的に呼び出す必要なく、クラス内でこのイベントをどのように処理できますか?
非常に単純なクラス:
このクラスはフォームで使用されます - 1 行だけです
ExcelRunner として ExcelRunner を暗くする = 新しい ExcelRunner
次に、フォームを閉じてエラーを受け取ります。
ありがとう