C#(4.0) サービスから COM を使用して C++ および C# DLL を呼び出そうとしています。DLL は同じサーバー (win2003) に登録されており、現在、COM を使用して C++ サービスから問題なく呼び出されています (10 万回以上)。DLL は、2 つの引数を取るインターフェイス「ExecuteTransaction」を公開します。
C# からそれらを呼び出そうとすると、さまざまなエラーが表示されます
COM DLL は起動しますが、次のエラーが発生します。
- 0x800706be;リモート プロシージャ コールに失敗しました。; 8004d00a;[Microsoft][Oracle 用の ODBC ドライバー]Resource Manager への参加の失敗
次に、C# サービスで次のエラーが発生します。
System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。---> System.Runtime.InteropServices.COMException: 操作が中止されました (HRESULT からの例外: 0x80000007) --- 内部例外スタック トレースの終了 --- System.RuntimeType.InvokeDispMethod (文字列名、BindingFlags invokeAttr、オブジェクト ターゲット、オブジェクト [] 引数、ブール値 [] byrefModifiers、Int32 カルチャ、文字列 [] namedParameters) で System.RuntimeType.InvokeMember (文字列名、BindingFlags bindingFlags、バインダー バインダー、オブジェクト ターゲット、オブジェクト [] providedArgs、ParameterModifier [] 修飾子、CultureInfo カルチャ、文字列 [] namedParams) で
別の C++ DLL は、イベント ログに次のメッセージが表示されてハングするだけです。
MS DTC コンポーネントで内部エラーが発生しました。プロセスを終了しています。エラーの詳細: 非 MS DTC XA ライブラリが関数 oerhms ntdll!KiFastSystemCallRet + 0x0 + 0xb837ce8 で例外をスローしました
コードは
using System;
using System.Collections.Generic;
using System.Reflection;
using System.EnterpriseServices;
using System.Data;
using System.Threading;
using System.Runtime.InteropServices;
....
int orderId = 65827;
int datasetId = 119849;
object objBM = null;
System.Guid bmGuid = new Guid("{43AFB035-9CFF-11D3-859D-0008C729AAEA}");
Type objBMType = Type.GetTypeFromCLSID(bmGuid);
objBM = Activator.CreateInstance(objBMType);
object[] args = {orderId,datasetId};
object c = objBMType.InvokeMember("ExecuteTransaction", System.Reflection.BindingFlags.InvokeMethod, null, objBM, args);
C# COM+ dll を呼び出しても問題が発生します。サービスはエラーになります
System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。---> System.Runtime.InteropServices.COMException: リモート プロシージャ コールに失敗しました。(HRESULT からの例外: 0x800706BE) --- 内部例外スタック トレースの終了 --- System.RuntimeType.InvokeDispMethod (文字列名、BindingFlags invokeAttr、オブジェクト ターゲット、オブジェクト [] 引数、ブール値 [] byrefModifiers、Int32 カルチャ、文字列 [] namedParameters) で System.RuntimeType.InvokeMember (文字列名、BindingFlags bindingFlags、バインダー バインダー、オブジェクト ターゲット、オブジェクト [] providedArgs、ParameterModifier [] 修飾子、CultureInfo カルチャ、文字列 [] namedParams) で
サービスと dll はすべて同じサーバー上にあります。私は何を間違っていますか?using ステートメントがありませんか? 私はWEBで例を見て試してみましたが、すべて同じエラーが発生しますか? 興味深いことに、DLL の呼び出し方法が間違っている場合のように、DLL は起動しますが、内部的に失敗します。