2016-09-18 57 views
0

我需要從我的應用程序調用第三方C++ exe(提供一個OLE自動化接口)。我希望能夠同時運行我的應用程序的多個實例。我所調用的第三方應用程序可以選擇針對不同的數據庫運行。C#強制實例化外部exe

如果我針對同一個數據庫運行我的應用程序(調用第三方應用程序)的多個實例,一切都很好。

如果我嘗試運行對一個數據庫,一個實例和對另一個數據庫中,我得到以下錯誤另一個實例:

服務器引發了異常。 (異常從HRESULT:0x80010105(RPC_E_SERVERFAULT))

我懷疑這是由於第二個實例沒有創建第三方應用程序的新實例,但使用相同的實例作爲我的應用程序的第一個副本。

聽起來可能?我懷疑,如果我看任務管理器,我只能看到在後臺進程中運行的第三方應用程序的副本,但在應用程序中運行我的應用程序的兩個副本。

那麼,我該如何強制我的應用程序創建第三方應用程序的第二個實例?

代碼:

Type tpType = Type.GetTypeFromProgID("thirdPty.Application"); 
dynamic comObject = Activator.CreateInstance(tpType); 

try 
{ 
      bool success = comObject.LoadDatabase(dbPath); 

      if (success) 
      { 
       var newTp = comObject.Open(inputFile); 

       newTp.Run(runType); 

       while (newTp.IsBusy) 
       { 
        // wait for process to finish 
        Thread.Sleep(500); 
       } 

       newAb.Export(outputFolder + "\\output" + " " + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".csv"); 

       newAb.Close(); 
      } 
} 
+0

首先,確保第三方應用程序旨在同時運行多個實例。您可能被迫使用不同的參數運行應用程序的相同實例以獲得所需的效果。 –

+0

第三方應用程序可以通過它自己的用戶界面運行,並且可以在不同的數據庫上同時愉快地運行 –

回答

1

我不認爲你可以。當你打電話給Activator.CreateInstance時,它是直到(D)COM服務器如何實例化它的Application COM對象。

顯然,這個註冊了REGCLS_MULTIPLEUSE,這意味着多個實例將從同一個服務器進程提供。人們會假設如果這是COM服務器的設計行爲,那麼當爲每個Application對象使用不同的數據庫連接時,它也應該表現得很好。