我们有一个具有以下接口和类声明的 C#/.Net COM 服务器(COM 可见程序集):
[ComVisible(true)]
[Guid( "..." )]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
void TestMethod( [In] int nNumElements,
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] byte [] bArray );
}
[ComVisible(true)]
[Guid( "..." )]
[ClassInterface( ClassInterfaceType.None )]
[ProgId( "CSCOMServer.CSTest" )]
public class CSTest : ITest
{
public void TestMethod( int nNumElements, byte [] bArray )
{
for (int i = 0; i < bArray.Length; i++)
{
bArray [i] = (byte)i;
}
}
}
生成的 IDL/typelib 是:
...
interface ITest : IUnknown {
HRESULT _stdcall TestMethod(
[in] long nNumElements,
[in, out] unsigned char* bArray);
};
...
coclass CSTest {
interface _Object;
[default] interface ITest;
};
目标是能够从 C++ COM 客户端使用它,使用以下内容可以正常工作:
int iSize = 10;
ITest *test;
byte *buf = (byte*)CoTaskMemAlloc( iSize * sizeof(byte) );
CoCreateInstance( CLSID_CSTest, NULL, CLSCTX_INPROC_SERVER, IID_ITest, (void **) &test );
test->TestMethod( iSize, buf );
缓冲区由 C++ 分配并传递给 C# 进行填充。一切正常,在 TestMethod() 完成后,C++ 数组 (buf) 包含由 C# 方法设置的正确值。
问题在于效率:
Interop 包装器是否在编组(“In”阶段)然后返回(“Out”阶段)期间执行数组复制,或者 C# 方法是否直接在传入的内存(可能被固定)上操作?