我正在使用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毫秒
小號
,如果你給你的VB6和C#代碼的一些細節可能有幫助。 VB6組件是一個out-of-proc服務器還是inproc?什麼是對象的實際TLB片段和您正在訪問的屬性。呼叫是通過IDispatch還是常規的COM接口?您是使用標準的OLE編組器還是自定義代理/存根或甚至是自定義編組器? – 2010-03-30 06:15:20
所以我設法通過不注入一個COM對象到COM調用(通過參數),而是在COM的一邊做所有事情,從而縮短了1秒的時間。但7秒仍然似乎過度轉移13000個字符! – 2010-03-30 09:19:10
還有其他事情正在發生。對BSTR進行收集需要幾微秒,而不是幾秒鐘。您應該調試VB6代碼,將C#exe設置爲啓動程序。 – 2010-03-30 13:00:24