2017-02-09 84 views
0

私が理解している壁に当たっています。インスタンス化したい単純なCOMサーバーがあります。私は(します。cscript myVBS)PSの実行空間/パイプラインと最後にProcess.Start、遅延バインディング、事前バインディングしようとした私のC#コードで.NETプロセスがActiveXオブジェクトを作成できません

$sms_client = New-Object -COM 'CPApplet.CPAppletMgr' 

Set controlPanelAppletManager = CreateObject("CPApplet.CPAppletMgr") 

:私は、単純なVBSまたはPSは、外部の私のEXEのコマンドで行うことができます。これらのシナリオでは、登録されていないクラスが戻ってきて失敗します。

//throws exception 
CPAPPLETLib.CPAppletMgr cpAppletMgr= new CPAPPLETLib.CPAppletMgr(); 

// myType does not come back null 
Type myType = Type.GetTypeFromProgID("CPApplet.CPAppletMgr"); 
// throws exception 
object myObject = Activator.CreateInstance(myType); 

更新:問題なしでScripting.FileSystemObjectを作成できます。私はそれを必要としません...それは単なるテストでした。

私は32ビット、64ビットをコンパイルしようとしました。標準ユーザーとして実行され、昇格しました。私は再びDLLを登録しようとしましたが、私のC#.NET EXEに関する何かが、COMを見ることができない何かをしています。私は新しいコンソールアプリケーションプロジェクトを作成しようと試みていましたが、それもそこにあります。

.NET 101 COM-Interopの基本となるものがありませんか?

Retrieving the COM class factory for component with CLSID {096C5BA8-044B-4BAC-9914-144723BA4F2A} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

更新:x64ののプラットフォームを設定するには、

エラーが離れて行かせました。 AnyCPUとx86は失敗します。つまり、32ビットと64ビットのワークステーション用に2つのバージョンのEXEを作成する必要がありますか?

+0

この資料は役立ちます:[32ビットまたは64ビットActiveXコンポーネントをx64 Windowsで使用する](http://cknotes.com/using-32-bit-or-64-bit-activex-components-on- x64-windows /) – TnTinMn

答えて

1

必ずしも2つのインスタンスを作成する必要はありません。 AnyCPUを作っている間は、1つしか作成できません。つまり、正しいランタイムに登録する必要があります。既定では、Visual Studioは32ビットランタイムのAnyCPUを64ビットマシンに登録します。 regasm.exeを64ビットランタイムと正しいバージョンのランタイムで確実に実行する場合は、64ビットプロセスから呼び出すことができるはずです。

私のお店では、一般的に、x86用に1つ、x64に1つをコンパイルし、適切なプラットフォームに適したものを展開しています。

+0

私は実際にこれに多くの経験があり、何らかの理由で悪い一日を過ごしていました。原因を絞り込むために、私は任意のCPUからx86に切り替えましたが、「32ビット優先」オプションに気づきませんでした。私は間違って私のプロセスが64ビットを実行していると仮定し、考えられる原因としてそれをマークしました。これは、何かが非常に単純なものを引き起こしている可能性があるのか​​を尋ねるストーリーのコーナーに私を残してしまった。 –

関連する問題