問題タブ [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.

0 投票する
0 に答える
256 参照

c# - Reflection を使用して COM オブジェクトのプロパティ情報を読み取ることはできますか?

Reflection を使用して COM オブジェクトのプロパティ情報を読み取ることはできますか?

以下のコードを使用して、COM オブジェクトのプロパティ名と値を取得しようとしています。

しかし、それは失敗します。

ここで接続は私のCOMオブジェクトです。

誰でも私を助けることができますか?

0 投票する
2 に答える
12620 参照

c# - RCW クリーンアップで競合を回避する方法

CPU負荷を定期的に表示するGUIアプリケーションがあります。負荷は StateReader クラスによって読み取られます。

GUI は、リアクティブ拡張機能を使用して更新されます。

アプリケーションを終了すると、次のエラーが表示されます

このエラーは、CPU 負荷を読み取らずにランダムな値を指定した場合には表示されないため、負荷の読み取りにエラーが何らかの形で関連しています。また、ブレークポイントを置いてしばらくApplication.Run(gui)待つと、エラーはそれほど頻繁には発生しないようです。

これと私のグーグル検索から、管理名前空間でクラスを使用すると、Runtime Callable Wrapper でラップされた COM オブジェクトを参照するバックグラウンド スレッドが作成され、アプリケーションを終了すると、そのスレッドは適切に閉じる時間がないと思います。 RCW、私のエラーにつながります。これは正しいですか、どうすればこの問題を解決できますか?


受け取った応答を反映するようにコードを編集しましたが、それでも同じエラーが発生します。コードは次の 3 点で更新されます。

  • StateReader は Disposable であり、その ManagementObjectSearcher を Dispose メソッドで破棄し、メイン メソッドで Application.Run の後に StateReader オブジェクトで Dispose を呼び出します。
  • CPULoad では、ManagementCollection とその中の各 ManagementObject を破棄します
  • メイン メソッドでは、GUI の FormClosing のイベント ハンドラーでサブスクリプション オブジェクトを破棄
    します。これにより、GUI を閉じた後にその GUI に対してイベントが生成されないようにする必要があります。

コードの関連部分は現在、StateReader にあります。

そして私のメインでは:

エラーを回避するために他にできることはありますか?

0 投票する
1 に答える
358 参照

c# - 静的 C# オブジェクトの原因: 基になる RCW から分離された COM オブジェクトは使用できません

外部 DLL から静的 devDrv を作成する MyObject があります。devDrv が MyObject コンストラクターによって作成された場合。コードは正常に動作します。devDrv が MyObject.Connect (以下の 2 番目のオブジェクトを参照) の 1 つによって作成された場合、MyObject.Connect() への最初の呼び出しは正常に機能します。2 回目の呼び出しで、「基になる RCW から分離された COM オブジェクトは使用できません」というエラーが表示されます。devDrv は永続的ではないようです。以下の 2 番目のオブジェクトに示すように、この devDrv オブジェクトを MyObject.Connect によって作成したいと考えています。よろしくお願いします。

0 投票する
1 に答える
494 参照

c++ - c++-基になるRCWから分離されたCOMオブジェクトは使用できません

私の問題は、タイトルのエラーメッセージです。

グーグルしようとしましたが、デストラクタ/リリースオブジェクトに関連する解決策しか見つかりませんでした。それは私がやりたいことではありません。

まず、私のコードは次のとおりです。

要するに:私はチェックリストボックスを持っています、コードのこの部分は必要なものが選択されたときに実行されます。チェックリストボックスには、Excelブックのさまざまなシートが一覧表示されます。チェックリストボックスで選択した項目に従って、ブックからシートを選択しようとしています。

最後のコード行(exWss = safe_cast(exApp-> ActiveWorkbook-> Sheets [p]);)で、前述のエラーメッセージが表示されます。

マーシャルの解放がそのような問題を引き起こす可能性があることを私は見ました。別の関数では、Marshal.Releasecomobjectを実行していますが、完全に分離されており、それがなくても同じエラーが発生します。

任意のアイデアをいただければ幸いです。

0 投票する
1 に答える
4432 参照

c# - 64 ビット アプリケーションで 32 ビット相互運用 DLL を使用する

64 ビット プロセスで 32 ビット相互運用 dll を使用することについて、少し混乱しています。8TB のメモリにアクセスするために、アプリケーションを 64 ビット用にビルドしますが、残念ながら、32 ビット モードでビルドされた統計的相互運用ライブラリを使用しています。このライブラリのソースがないため、64 ビットに再構築できません。

この記事では IPC (WCF など) を使用してアプリと通信する 64 ビット サロゲート プロセスを作成することを提案します。ここでは、Runtime Callable Wrapper ( RCW )を使用するソリューションを見つけることができます。どちらが良いですか?代理プロセスの実装を開始しましたが、今日、自分のニーズに適しているかどうかわからない2番目のソリューションを見つけました。

この統計的相互運用ライブラリには、何百ものインターフェイスとクラスがあることに言及する必要があります。それでも私はそれらのいくつかを必要としています。それらのいくつかをエンドポイントとしてホストする WCF サービスの作成を開始しましたが、多くのコード/作業が必要になるようです。

2 番目の方法 (RCW) を使用して相互運用 dll を使用できますか?

よろしく、ヨトベク

0 投票する
1 に答える
1883 参照

c# - LINQPad を Dump() System.__ComObject 参照に取得するには?

私はLINQPadを使用して小さなArcObjects ( ESRI の ArcGISソフトウェア用の COM ベースのライブラリ) アプリケーションを迅速に開発して遊んでおりDump()、.NET から初期化する COM オブジェクトのプロパティにそれを使用することに成功しましたが、既存の COM オブジェクトから取得されたものは、単にSystem.__ComObject参照としてダンプされるだけであり、特に有用ではありません。

LINQパッドのスクリーンショット

このヘルプ トピックでは、これが発生する理由を説明していますが、これは理解できたと思いますが、特に LINQPad (さらに) をより強力にするというコンテキストで、この動作を回避するためのオプションを知りたいです。

興味深いことに、Visual Studio のデバッガーは、これらのオブジェクトのプロパティを表示でき、値の型の値も表示できます。

Visual Studio の ArcObject のデバッグ

Visual Studio はこのイントロスペクションを実現するためにどのメカニズムを使用しますか? また、LINQPad の Dump メソッドが同じことを行わないのはなぜですか? 編集: VS がこれを行う方法に関する関連する質問を参照してください: Visual Studio のデバッガー/対話型ウィンドウは、.NET の COM オブジェクトのプロパティをどのようにダンプしますか?

ArcObjects .NET SDKには、COM インターフェイスを実装できる各 CoClass の RCW を備えた PIA が含まれているため、これらのオブジェクトをプログラムでラップできるはずだと考えています。

回避策としてMarshal.CreateWrapperOfType()、LINQ クエリ内で使用して、LINQPad に強制的にオブジェクトのプロパティをダンプさせることに成功しました。もちろん、これは値型プロパティのみを適切にダンプします。COM ベースの参照型プロパティは引き続き として報告されるSystem.__ComObjectため、適切な解決策として再帰的に動作し、それらをラップする必要があります。

以前の質問で、CoClass が を実装しているかどうかを実行時に決定できることを知りました。IPersistこれは、ArcObjects の大部分が行っています。この手法または別の手法を使用しSystem.__ComObjectて、PIA から適切な RCW に自動的に強制することはできますか? もしそうなら、ICustomMemberProvider実装を提供するなどして、LINQPadでこれを実装するにはどうすればよいですか? これを再帰的にして、COM オブジェクトでもあるプロパティもラップできるようにすることはできますか?

.NET 4.0 をターゲットとする LINQPad 4.x を使用していますが、LINQPad 2.x のサポートにも関心があります (.NET 3.5 と .NET 4.0 の両方で動作するソリューションが望ましいですが、必須ではありません)。

更新:System.__ComObjectによって返された CLSID を使用して RCW でa をラップする方法である私の質問の最初の部分を理解しましたIPersist.GetClassID。私が使用しているコードについては、この関連する質問この回答を参照してください。

これを LINQPad の Dump メソッドに組み込む方法を知りたいです。

0 投票する
2 に答える
1600 参照

c# - CLSID からランタイム呼び出し可能ラッパー クラスの System.Type を取得する方法は?

注:背景情報については、次の関連する質問を参照してください: LINQPad を Dump() System.__ComObject 参照に取得するには?

を使用して、COM オブジェクトに対応する RCW クラスの CLSID を取得できます (別の COM オブジェクトから取得され、コードによって初期化されていませんIPersist.GetClassID()) 。

Type.GetTypeFromCLSID()厳密に型指定された RCW クラスではなくSystem.__ComObject、常に弱く型指定された を返します。

System.Typeを使用して COM オブジェクトをラップできるようにするには、厳密に型指定された RCW クラスのを取得する必要がありますMarshal.CreateWrapperOfType()

これは可能ですか、それとも COM 相互運用がどのように機能するかにより、これは開始できませんか?

0 投票する
1 に答える
1027 参照

.net - タイプ 'COMSVCSLib.ObjectControl' は、参照されていないアセンブリで定義されています

  • 2 つの VB 6 アセンブリ (DLL) があります。ProgramA.dll と ProgramB.dll を .NET Web サービス (バージョン 2.0) に参照として追加する必要があります。
  • これら 2 つの DLL は、別の開発者から引き渡されました。
  • ある開発者は私に単に ProgramA.dll をくれました
  • 別の開発者から、ProgramB.dll、ProgramB.exp、および ProgramB.lib が提供されました。
  • regsvr32 を使用して ProgramA.dll を登録し、その参照を .NET プロジェクトに追加しました。
  • 次に、.NET プロジェクトに ProgramB.dll の参照を追加しました。

  • .NET Web サービスをビルドしようとすると、次のエラーが表示されます。タイプ 'COMSVCSLib.ObjectControl' は、参照されていないアセンブリで定義されています。.NET アプリケーションのリファレンスで次のファイルを確認できます。 COMSVCSLib Interop.COMSVCSLib Interop.ProgramA Interop.ProgramB

また、コードは ProgramB アセンブリの問題を示しています (これらの .exp および .lib ファイルがありました)。

考えられる理由は何ですか、またはここで何か間違ったことをしていますか?

0 投票する
1 に答える
182 参照

.net - COM RCW - ActiveX コンポーネントがオブジェクトを作成できない

「ProgramA.dll」という 1 つの COM コンポーネントがあります。この COM コンポーネントは内部で「ProgramB.dll」を参照し、次のように基になるオブジェクトのインスタンスを作成します。

.NET アプリケーションに ProgramA.dll の参照を追加しました (.NET アプリに ProgramB の参照も追加しました)。

.NET アプリケーションから ProgramA の "AddData()" メソッドを呼び出すと、ProgramB.clsClassA のインスタンスを作成しようとして失敗し、"AcitveX コンポーネントはオブジェクトを作成できません" というエラーが表示されます。

考えられる理由は何ですか、またはどのような変更が必要ですか?