2010-03-30 30 views
7

我正在使用COM Interop。我在VB6中調用了一個大約13000個字符的字符串。如果我在純VB6中執行調用,則需要大約800ms才能執行。如果我通過c#和COM Interop執行它大約需要8秒。我假設延遲是由編組引起的。在C中訪問VB6字符串的最快方法#

如果我對編組正確的,我會很感激,如果有人可以建議我可以進入C#這樣的最快方式。例如是否會更好 a)將它暴露爲字節數組 b)向VB6層提供byref字符串參數

我會欣賞一些示例代碼。我試過

Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0) 

無濟於事。

-

繼Franci的評論。我只是從C#dll引用VB6 DLL(如此處理)。下面是從OLEVIEW

interface _MyCOMObect : IDispatch { 
     ... 
     [id(0x60030006)] 
     HRESULT GetString(
         [in] _IEventHistory* p_oEventHistory, 
         [out, retval] _IXML**); 
     ... 
    }; 

    [ 
     uuid(09A06762-5322-4DC1-90DD-321D4EFC9C3E), 
     version(1.0), 
     custom({17093CC6-9BD2-11CF-AA4F-304BF89C0001}, "0") 
    ] 
    coclass MyCOMObject { 
     [default] interface _CFactory; 
    }; 

    [ 
     odl, 
     uuid(C6E7413F-C63A-43E4-8B67-6AEAD132F5E5), 
     version(1.0), 
     hidden, 
     dual, 
     nonextensible, 
     oleautomation 
    ] 

提取物我也許應該指出的是,參數(p_oEventHistory)是我實例在C#中的另一個COM對象,但需要大約80毫秒

小號

+0

,如果你給你的VB6和C#代碼的一些細節可能有幫助。 VB6組件是一個out-of-proc服務器還是inproc?什麼是對象的實際TLB片段和您正在訪問的屬性。呼叫是通過IDispatch還是常規的COM接口?您是使用標準的OLE編組器還是自定義代理/存根或甚至是自定義編組器? – 2010-03-30 06:15:20

+0

所以我設法通過不注入一個COM對象到COM調用(通過參數),而是在COM的一邊做所有事情,從而縮短了1秒的時間。但7秒仍然似乎過度轉移13000個字符! – 2010-03-30 09:19:10

+1

還有其他事情正在發生。對BSTR進行收集需要幾微秒,而不是幾秒鐘。您應該調試VB6代碼,將C#exe設置爲啓動程序。 – 2010-03-30 13:00:24

回答

2

幾件事情: -

  1. 我VB6是有點生疏,但你的IDL摘錄表明GetString方法實際上返回實現IXML接口的對象。我有點驚訝Marshal.PtrToStringAuto可以做任何有用的事情。你可以改變VB6,以便它實際返回String類型的東西嗎?

  2. COM +的影響潛力巨大。首先,我會建議你比較第一次調用和後續調用的時間。首次調用COM6時,COM +需要爲VB6組件啓動一個主機進程,因此第一次調用總是更加痛苦。注意這發生在第一次調用時,而不是對象實例化。其次,你的組件在COM +中的配置方式也可以有很大的不同,如果您禁用了實際上不需要的所有COM +服務(例如事務),則可能可以刪除COM +放置在所有方法調用周圍的一些攔截邏輯。最終,如果您不需要COM +提供的服務,請不要使用它。

相關問題