サードパーティのアプリケーションと通信する必要があります。そのための唯一の方法は、提供されているCOMコンポーネントにアクセスすることです。インタラクションには約3分かかるため、バックグラウンドで行う必要があります。だから私がやろうとしたのは、オプション「embeddinterop-types」=trueのコンポーネントへの参照を追加し、インターフェイスを介して非常に基本的なデータを読み取るテストを作成することです。これを行うための文書化された方法は、次のコードによるものです。
System sys = new System();
if(Convert.ToBoolean(sys.Initialize()) && Convert.ToBoolean(sys.Login("John Smith", out userInstance)))
Project proj = new Project();
if (Convert.ToBoolean(proj.Open(sys, m_projName, m_scenarioName)))
someValue = proj.Name;
これは、BackgroundWorkerが使用されるまで完全に機能します。次に、コードの最初の行に次のエラーが表示されます。
タイプ'System.__ComObject'のCOMオブジェクトをインターフェイスタイプ'ICAPILib.System'にキャストできません。次のエラーが原因で、IID'{1F5EB3E2-35F6-11D2-A191-0060083A260B}'のインターフェイスのCOMコンポーネントに対するQueryInterface呼び出しが失敗したため、この操作は失敗しました。タイプライブラリ/DLLの読み込み中にエラーが発生しました。(HRESULTからの例外:0x80029C4A(TYPE_E_CANTLOADLIBRARY))。
コンポーネントの再登録を試しましたが、成功しませんでした。
BackgroundWorkerを使用する場合、スレッドアパートメントタイプは明らかにMTAです。COMコンポーネントでは、ThreadingModelがapartmentに設定されています。この記事 http://msdn.microsoft.com/en-us/library/eaw10et3.aspx を正しく理解していれば、相互運用機能のマーシャリングでオブジェクトへのアクセスを処理する必要があります。
誰かが私がこの仕事をするために何を試みることができるかについての手がかりを持っていますか?