S
Simon Woods
Hi
I am using COM Interop. I have a call in VB6 which returns a string of
roughly 13000 chars. If I execute the call in pure VB6 it takes about
800ms to execute. If I execute it via c# and COM Interop it takes about
8 seconds. I'm assuming the delay is caused by marshaling.
If I am correct about marshaling, I'd be grateful if someone could
suggest the fastest way I can get this into C#. e.g. Would it be better
to, say
a) expose it as a byte array
b) provide a byref string param into the VB6 layer
I would appreciate some sample code as well. I tried the
Marshal.PtrToStringAuto(
Marshal.ReadIntPtr(myCOMObject.GetString(myParam), 0
)
to no avail.
--
I am simply referencing the VB6 dll (so it is "in process") from a C#
dll. Here's an extract from 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
]
I should probably point out that the parameter (p_oEventHistory) is
another COM object which I am instantiating in C# but that takes about
80ms. I have tried removing this, as well as the return type, so that I
was simply passing and receive strings rather than a more complex COM
interface and this indeed reduced the execution time by 1 second. But it
still meant that it is taking about 7 secs to marshall 13000 chars -
which seems excessive, tmm. But perhaps not?
Any thoughts would be gratefully received
Thx
Simon
I am using COM Interop. I have a call in VB6 which returns a string of
roughly 13000 chars. If I execute the call in pure VB6 it takes about
800ms to execute. If I execute it via c# and COM Interop it takes about
8 seconds. I'm assuming the delay is caused by marshaling.
If I am correct about marshaling, I'd be grateful if someone could
suggest the fastest way I can get this into C#. e.g. Would it be better
to, say
a) expose it as a byte array
b) provide a byref string param into the VB6 layer
I would appreciate some sample code as well. I tried the
Marshal.PtrToStringAuto(
Marshal.ReadIntPtr(myCOMObject.GetString(myParam), 0
)
to no avail.
--
I am simply referencing the VB6 dll (so it is "in process") from a C#
dll. Here's an extract from 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
]
I should probably point out that the parameter (p_oEventHistory) is
another COM object which I am instantiating in C# but that takes about
80ms. I have tried removing this, as well as the return type, so that I
was simply passing and receive strings rather than a more complex COM
interface and this indeed reduced the execution time by 1 second. But it
still meant that it is taking about 7 secs to marshall 13000 chars -
which seems excessive, tmm. But perhaps not?
Any thoughts would be gratefully received
Thx
Simon