問題タブ [servicedcomponent]
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 +:スローされた例外の代わりにApplicationException
COM+コンポーネントを呼び出すASP.netWebサービスを入手しました。COM +コンポーネントのクラスは、処理したい例外をスローします。ただし、ApplicationExceptionは、実際の例外ではなくwebbserviceによってキャッチされます。
何故ですか?
編集:例外の詳細
.net - ServicedComponentでトランザクションの中止を検出する方法は?
分散トランザクションに参加するために、System.EnterpriseServices.ServicedComponentを作成しようとしています。私の主な方法は次のようになります。
私がやろうとしているのは、分散トランザクションが中止されたか(またはロールバックされたか)を検出してから、変更のロールバックにも進むことです。たとえば、ディスク上にファイルを作成したり、元に戻す必要のあるいくつかの副作用を実行したりした可能性があります。
SystemTransaction.TransactionCompletedイベントを処理しようとしたか、Dispose()メソッドでSystemTransactionの状態を調べましたが成功しませんでした。
これは「取引」ではなく「補償」に似ていると理解しています。
私がやろうとしていることは意味がありますか?
c# - ac# .net からの戻り値を使用してコンポーネントを com+ としてビルド
これまでのところ、C# .NET 4 でコンポーネントを作成し、System.EnterpriseServices を使用して COM で表示できるようにしました。ビジネス メソッドを C# で開発したいのですが、従来の ASP (vbscript) からアクセスする必要があります。
これまでのところ、すべて正常に動作します (関数のオーバーロードを除く:))。ここで、戻りコードでより多くの経験を得るためにテストクラスを作成しました。
次に、porpuse をテストするために cscript.exe で実行する単純な vbscript ファイルを作成しました。
うまくいくもの:
配列、jaggedarray、または辞書に関しては、型の不一致が発生します。VarType は辞書の 13 オブジェクトです。たとえば、この dict は Scripting.Dictionary とは異なるようです。
私は一日中 codeproject.com と stackoverflow をチェックしましたが、誰かが IDispatch インターフェイスを作成する必要があると述べた stackoverflow のいくつかのスレッドを除いて、ヒントは見つかりませんでした。
誰かが同じ問題を抱えていて、私を助けたり、私が続けることができるヒントを教えてくれますか?
c# - ServicedComponent を低い優先度で実行する
ServicedComponent
非常に CPU を集中的に使用する(COM+ サーバー アプリケーション) があります。これは Windows サービスから呼び出され、完了するまでにかかる時間はそれほど重要ではありません。
ただし、優先度を低くして実行する必要があります。優先度を変更するにはどうすればよいですか?
transactions - [オートコンプリート] でネストされたコンポーネント
次のように使用する 2 つのServiceComponent
クラスがあるとします。
と の両方が、そのメソッドで属性MyComponent1
をMyComponent2
使用します。[AutoComplete]
MyComponent2
破棄されたときにコミットしますか、それともによって開始されたトランザクションを待機しますMyComponent1
か?
.net - GAC 外の COM+ アプリケーションに .NET アセンブリを登録する
2 つのサービス コンポーネントを公開する .NET アセンブリ (.NET 4.0、厳密な名前) を開発しました。アセンブリ (dll) は、COM+ アプリケーションでホストされることが想定されており、COM+ 属性 (アセンブリおよびコンポーネント レベル) で装飾されています。たとえば、アセンブリ レベルの属性は次のとおりです。
現在 (開発上の理由で)、次のスクリプトを実行して COM+ アプリケーションを作成し、アセンブリを (そのすべてのコンポーネントと共に) 登録しています。
上記のバッチ ファイルは、(1 回の実行で) アセンブリ装飾属性に従って COM+ アプリケーションを作成し、COM+ アプリに MyComPlusAssembly.dll ファイルを登録し、その中にすべての ComVisible コンポーネントを登録します。 . このコマンドは、新しい TLB ファイルも生成します。アセンブリは AnyCPU を使用してビルドされるため、Windows の x64 バージョンでは dllhost.exe プロセスは 64 ビットとして実行され、Windows の x86 バージョンでは 32 ビットとして実行されます。また、dll ファイルをGAC に配置しないでください(これが、RegSvcs.exe コマンドライン ユーティリティの /appdir スイッチを使用している理由です)。上記のバッチ ファイルを使用して COM+ アセンブリをインストールすると、すべてが期待どおりに機能します。
私は自分のアプリの Wix (v3.6) 展開プロジェクトを書き始めました。これは、同じことを行うことになっています。つまり、COM+ アプリケーションを作成し、.NET アセンブリとすべての ComVisible コンポーネントを登録します。今回は、TLB ファイルがインストーラー (*.msi) に付属しているという事実に依存していることに注意してください。TLB は、ビルド プロセス (VS 2010) によって生成されました。上記を実現するために、次の Wix コンポーネントを追加しました (Wix COM+ 拡張ドキュメント - WixComPlusExtension に触発されました):
MSI プロジェクトは正常にビルドされますが、インストール プロセスは失敗し、dll を登録しようとするとすぐにロールバックされます。次のエラーがログに記録されています ( x86 と x64 の両方のバージョン)。
上記のエラーは、COM+ アプリに登録されている dll が見つからない、つまり、ファイルがディスク上にないことを意味している可能性があります。インストール プロセスは高速ですが、MyComPlusAssembly.dll ファイルがディスク ([INSTALLDIR_SERVER]) にコピーされているのを見たことがありません。インストールがロールバックを開始すると、他のすべてのファイルがディスク上にあります (TLB を含む)。これはタイミングの問題ですか?
所見:
- これは、インストーラーの両方のバージョン (x64 & x86) で発生します。
- " " タグ (入れ子になったコンポーネントを含む) を削除
<complus:ComPlusAssembly...>
すると、インストールは成功し、(空の) アプリケーションが作成されます。つまり、アセンブリや COM+ でホストされたコンポーネントを使用せずに、コンテナーのみが作成されます。 <Component.../>
簡単なレジストリ キーを作成し、すべての<complus:ComPlusApplication.../>
コードをそこに移動する 3 番目の " " を追加してみました。このコンポーネントは、すべてのファイルがコピーされた後に実行されます。上記のログと同じ結果 (エラー)。
ここで何が欠けていますか?
c# - 一部が失敗した場合にトランザクションをコミットする
次のようなCOM+で実行されているメソッドがあります。
OKしたがって、メソッドが実行され、DoSomeDBWork()メソッドが実行され、DBに対していくつかの更新が行われます。
'insert fail'が実行され、失敗します。無視したいのですが、失敗したのでログアウトしてください。
しかし、エラーが生成されます:System.Transactions.TransactionException:操作はトランザクションの状態に対して無効です。
例外をキャッチしても、DBエラーであるため、トランザクションが自動的にロールバックされていると思います。
エラーは「ログに挿入...」の行から発生し
、DoSomeDBWork()で更新されたすべてのものもロールバックされます。
失敗した行を無視するにはどうすればよいですか?
com+ - ステップ イン / ServicedComponent のデバッグ
テスト コードに参照 (デバッグ モード) として追加した ServicedComponent があり、dll と同じフォルダーに pdb ファイルがあります。
VS 2010 を使用しています。両方のプロジェクト設定で [アンマネージ コードのデバッグを有効にする] と [Visual Studio ホスティング プロセスを有効にする] をオンにしました。どちらのプロジェクトもローカルです。
できるのですが、踏み込もうとしても踏み込めません。次の行にジャンプしてしまいます。
この ServicedComponent をデバッグするには、他に何をする必要がありますか?