Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提高SAFEARRAY自定义封送拆收器的性能_C#_Com - Fatal编程技术网

C# 提高SAFEARRAY自定义封送拆收器的性能

C# 提高SAFEARRAY自定义封送拆收器的性能,c#,com,C#,Com,我为SAFEARRAY编写了一个自定义封送拆收器,但它的性能大约比默认封送拆收器的性能低两倍。我逐个元素执行数组的封送处理,因为它们可能有超过1-2个维度。我使用了一段代码。我可以提高我的封送员的绩效吗 void ArrayIterator::GetValue(Array^ pManagedArray, Object^% managedObject) { managedObject = pManagedArray->GetValue(m_pManagedArrayIndices);

我为SAFEARRAY编写了一个自定义封送拆收器,但它的性能大约比默认封送拆收器的性能低两倍。我逐个元素执行数组的封送处理,因为它们可能有超过1-2个维度。我使用了一段代码。我可以提高我的封送员的绩效吗

void ArrayIterator::GetValue(Array^ pManagedArray, Object^% managedObject)
{
    managedObject = pManagedArray->GetValue(m_pManagedArrayIndices);
}

void ArrayIterator::GetValue(SAFEARRAY* pNativeArray, LPVOID* ppNativeValue)
{
    CHECK_HR(::SafeArrayLock(pNativeArray));
    CHECK_HR(::SafeArrayPtrOfIndex(pNativeArray, m_pNativeArrayIndices, ppNativeValue));
    CHECK_HR(::SafeArrayUnlock(pNativeArray));
}

void ArrayIterator::SetValue(Array^ pManagedArray, Object^ managedValue)
{
    pManagedArray->SetValue(managedValue, m_pManagedArrayIndices);
}

void ArrayIterator::SetValue(SAFEARRAY* pNativeArray, LPVOID pNativeValue)
{
    CHECK_HR(::SafeArrayPutElement(pNativeArray, m_pNativeArrayIndices, pNativeValue));
}

void SafeArrayMarshaler::PutManagedElementToNativeArray(SAFEARRAY* pNativeArray, ArrayIterator^ pArrayIterator, ArrayElementType^ pArrayElementType, Object^ pManagedObject)
{
    if (IsBlittableType(pArrayElementType->ManagedType))
    {
        GCHandle^ gcHandle = GCHandle::Alloc(pManagedObject, GCHandleType::Pinned);

        pArrayIterator->SetValue(pNativeArray, gcHandle->AddrOfPinnedObject().ToPointer());

        gcHandle->Free();
    }        
    else if (pArrayElementType->NativeType == VT_BOOL)
    {
        Boolean managedBooleanValue = safe_cast<Boolean>(pManagedObject);
        IntPtr nativeBoolPointer = Marshal::AllocHGlobal(sizeof(VARIANT_BOOL));
        VARIANT_BOOL* pNativeBool = reinterpret_cast<VARIANT_BOOL*>(nativeBoolPointer.ToPointer());

        *pNativeBool = managedBooleanValue == true ? VARIANT_TRUE : VARIANT_FALSE;

        pArrayIterator->SetValue(pNativeArray, pNativeBool);

        Marshal::FreeHGlobal(nativeBoolPointer);
    }
    else if (pArrayElementType->NativeType == VT_DATE)
    {
        DateTime managedDateValue = safe_cast<DateTime>(pManagedObject);
        IntPtr nativeDatePointer = Marshal::AllocHGlobal(sizeof(DATE));
        DATE* pNativeDate = reinterpret_cast<DATE*>(nativeDatePointer.ToPointer());

        *pNativeDate = managedDateValue.ToOADate();

        pArrayIterator->SetValue(pNativeArray, pNativeDate);

        Marshal::FreeHGlobal(nativeDatePointer);
    }
    else if (pArrayElementType->NativeType == VT_BSTR)
    {
        IntPtr nativeBSTRHandle = Marshal::StringToBSTR(safe_cast<String^>(pManagedObject));

        pArrayIterator->SetValue(pNativeArray, nativeBSTRHandle.ToPointer());

        Marshal::FreeBSTR(nativeBSTRHandle);
    }
    else if (pArrayElementType->NativeType == VT_INT)
    {
        IntPtr managedPointer = safe_cast<IntPtr>(pManagedObject);

        pArrayIterator->SetValue(pNativeArray, managedPointer.ToPointer());
    }
    else if (pArrayElementType->NativeType == VT_UINT)
    {
        UIntPtr managedPointer = safe_cast<UIntPtr>(pManagedObject);

        pArrayIterator->SetValue(pNativeArray, managedPointer.ToPointer());
    }
    else if (pArrayElementType->NativeType == VT_DISPATCH)
    {
        IntPtr nativeInterfacePointer = Marshal::GetIDispatchForObject(pManagedObject);

        pArrayIterator->SetValue(pNativeArray, nativeInterfacePointer.ToPointer());

        Marshal::Release(nativeInterfacePointer);
    }
    else if (pArrayElementType->NativeType == VT_UNKNOWN)
    {
        IntPtr nativeInterfacePointer = Marshal::GetIUnknownForObject(pManagedObject);

        pArrayIterator->SetValue(pNativeArray, nativeInterfacePointer.ToPointer());

        Marshal::Release(nativeInterfacePointer);
    }
    else if (pArrayElementType->NativeType == VT_VARIANT)
    {
        IntPtr nativeVariantHandle = Marshal::AllocHGlobal(sizeof(VARIANT));

        Marshal::GetNativeVariantForObject(pManagedObject, nativeVariantHandle);

        pArrayIterator->SetValue(pNativeArray, nativeVariantHandle.ToPointer());

        Marshal::FreeHGlobal(nativeVariantHandle);
    }
    else
    {
        throw gcnew InvalidOperationException();
    }
}

void SafeArrayMarshaler::PutNativeElementToManagedArray(Array^ pManagedArray, ArrayIterator^ pArrayIterator, ArrayElementType^ pArrayElementType, LPVOID pNativeObject)
{
    if (IsBlittableType(pArrayElementType->ManagedType))
    {
        switch (Type::GetTypeCode(pArrayElementType->ManagedType))
        {
            case TypeCode::SByte:
            {
                SByte managedSignedByte = Marshal::ReadByte(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedSignedByte);
                break;
            }

            case TypeCode::Byte:
            {
                Byte managedUnsignedByte = Marshal::ReadByte(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedUnsignedByte);
                break;
            }

            case TypeCode::Int16:
            {
                Int16 managedValue = Marshal::ReadInt16(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::UInt16:
            {
                UInt16 managedValue = Marshal::ReadInt16(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::Int32:
            {
                Int32 managedValue = Marshal::ReadInt32(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::UInt32:
            {
                UInt32 managedValue = Marshal::ReadInt32(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::Int64:
            {
                Int64 managedValue = Marshal::ReadInt64(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::UInt64:
            {
                UInt64 managedValue = Marshal::ReadInt64(IntPtr(pNativeObject));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::Single:
            {
                Single managedValue;
                pin_ptr<Single> pManagedValue = &managedValue;

                ::memcpy_s(pManagedValue, Marshal::SizeOf(Single::typeid), pNativeObject, Marshal::SizeOf(Single::typeid));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            case TypeCode::Double:
            {
                Double managedValue;
                pin_ptr<Double> pManagedValue = &managedValue;

                ::memcpy_s(pManagedValue, Marshal::SizeOf(Double::typeid), pNativeObject, Marshal::SizeOf(Double::typeid));
                pArrayIterator->SetValue(pManagedArray, managedValue);
                break;
            }

            default:
                throw gcnew NotImplementedException();
        }
    }
    else if (pArrayElementType->NativeType == VT_BOOL)
    {
        VARIANT_BOOL* pNativeBooleanValue = reinterpret_cast<VARIANT_BOOL*>(pNativeObject);

        pArrayIterator->SetValue(pManagedArray, *pNativeBooleanValue == VARIANT_TRUE ? true : false);
    }
    else if (pArrayElementType->NativeType == VT_DATE)
    {
        DATE* pNativeDateValue = reinterpret_cast<DATE*>(pNativeObject);

        pArrayIterator->SetValue(pManagedArray, DateTime::FromOADate(*pNativeDateValue));
    }
    else if (pArrayElementType->NativeType == VT_BSTR)
    {
        String^ pManagedString = Marshal::PtrToStringBSTR(IntPtr(*reinterpret_cast<void**>(pNativeObject)));

        pArrayIterator->SetValue(pManagedArray, pManagedString);
    }
    else if (pArrayElementType->NativeType == VT_INT)
    {
        INT_PTR nativePointer = reinterpret_cast<INT_PTR>(pNativeObject);

        pArrayIterator->SetValue(pManagedArray, IntPtr(nativePointer));
    }
    else if (pArrayElementType->NativeType == VT_UINT)
    {
        UINT_PTR nativePointer = reinterpret_cast<UINT_PTR>(pNativeObject);

        pArrayIterator->SetValue(pManagedArray, UIntPtr(nativePointer));
    }
    else if (pArrayElementType->NativeType == VT_DISPATCH ||
             pArrayElementType->NativeType == VT_UNKNOWN)
    {
        Object^ pManagedObject = Marshal::GetObjectForIUnknown(IntPtr(*reinterpret_cast<void**>(pNativeObject)));

        pArrayIterator->GetValue(pManagedArray, pManagedObject);
    }
    else if (pArrayElementType->NativeType == VT_VARIANT)
    {
        Object^ pManagedObject = Marshal::GetObjectForNativeVariant(IntPtr(pNativeObject));

        pArrayIterator->SetValue(pManagedArray, pManagedObject);
    }
    else
    {
        throw gcnew InvalidOperationException();
    }
}
void ArrayIterator::GetValue(数组^pManagedArray,对象^%managedObject)
{
managedObject=pManagedArray->GetValue(m_pManagedArray索引);
}
void ArrayIterator::GetValue(安全数组*pNativeArray,LPVOID*pNativeValue)
{
检查人力资源(::安全防盗锁(PNATIVEARLAY));
检查人力资源(::安全arrayProfIndex(pNativeArray、m_pNativeArrayIndex、pNativeValue));
检查人力资源(::安全阵列锁定(pNativeArray));
}
void ArrayIterator::SetValue(数组^pManagedArray,对象^managedValue)
{
pManagedArray->SetValue(managedValue,mpmanagedarray索引);
}
void ArrayIterator::SetValue(安全数组*pNativeArray,LPVOID pNativeValue)
{
检查人力资源(::SafeArrayPutElement(pNativeArray,m_pnativeArrayIndex,pNativeValue));
}
void SafeArrayMarshaler::PutManagedElementToNativeArray(SAFEARRAY*PnaviArray,ArrayIterator^ pArrayIterator,ArrayElementType^ pArrayElementType,Object^ pManagedObject)
{
if(IsBlittableType(pArrayElementType->ManagedType))
{
GCHandle^GCHandle=GCHandle::Alloc(pManagedObject,GCHandleType::pinted);
pArrayIterator->SetValue(pNativeArray,gcHandle->AddRofPindedObject().ToPointer());
gcHandle->Free();
}        
否则如果(pArrayElementType->NativeType==VT_BOOL)
{
布尔managedBooleanValue=safe_cast(pManagedObject);
IntPtr nativeBoolPointer=Marshal::AllocHGlobal(sizeof(VARIANT_BOOL));
VARIANT_BOOL*pNativeBool=reinterpret_cast(nativeBoolPointer.ToPointer());
*pNativeBool=managedBooleanValue==true?VARIANT\u true:VARIANT\u FALSE;
pArrayIterator->SetValue(pNativeArray,pNativeBool);
元帅:FreeHGlobal(nativeBoolPointer);
}
否则如果(pArrayElementType->NativeType==VT_日期)
{
DateTime managedDateValue=safe_cast(pManagedObject);
IntPtr nativeDatePointer=Marshal::AllocHGlobal(sizeof(DATE));
DATE*pNativeDate=reinterpret_cast(nativeDatePointer.ToPointer());
*pNativeDate=managedDateValue.ToOADate();
pArrayIterator->SetValue(pNaviArray,pNaviEdate);
Marshal::FreeHGlobal(nativeDatePointer);
}
否则如果(pArrayElementType->NativeType==VT\u BSTR)
{
IntPtr nativeBSTRHandle=Marshal::StringToBSTR(safe_cast(pManagedObject));
pArrayIterator->SetValue(pNativeArray,nativeBSTRHandle.ToPointer());
元帅:FreeBSTR(nativeBSTRHandle);
}
else if(pArrayElementType->NativeType==VT_INT)
{
IntPtr managedPointer=safe_cast(pManagedObject);
pArrayIterator->SetValue(pNativeArray,managedPointer.ToPointer());
}
否则如果(pArrayElementType->NativeType==VT_UINT)
{
uintpttr managedPointer=safe_cast(pManagedObject);
pArrayIterator->SetValue(pNativeArray,managedPointer.ToPointer());
}
否则如果(pArrayElementType->NativeType==VT\U调度)
{
IntPtr nativeInterfacePointer=Marshal::GetIDispatchForObject(pManagedObject);
pArrayIterator->SetValue(pNativeArray,nativeInterfacePointer.ToPointer());
封送:释放(nativeInterfacePointer);
}
否则如果(pArrayElementType->NativeType==VT_未知)
{
IntPtr nativeInterfacePointer=Marshal::getiunknownfobject(pManagedObject);
pArrayIterator->SetValue(pNativeArray,nativeInterfacePointer.ToPointer());
封送:释放(nativeInterfacePointer);
}
else if(pArrayElementType->NativeType==VT_变量)
{
IntPtr nativeVariantHandle=Marshal::AllocHGlobal(sizeof(VARIANT));
Marshal::GetNativeVariantForObject(pManagedObject,nativeVariantHandle);
pArrayIterator->SetValue(pNativeArray,nativeVariantHandle.ToPointer());
元帅:弗里赫全球(nativeVariantHandle);
}
其他的
{
抛出新的InvalidOperationException();
}
}
void SafeArrayMarshaler::PutNativeElementToManagedArray(数组^pManagedArray、ArrayIterator、pArrayIterator、ArrayElementType^ pArrayElementType、LPVOID pNactiveObject)
{
if(IsBlittableType(pArrayElementType->ManagedType))
{
开关(类型::GetTypeCode(pArrayElementType->ManagedType))
{
案例类型代码::SByte:
{
SByte managedSignedByte=Marshal::ReadByte(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedSignedByte);
打破
}
大小写类型代码::字节:
{
字节managedSignedByte=Marshal::ReadByte(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedUnsignedByte);
打破
}
案例类型代码::Int16:
{
Int16 managedValue=Marshal::ReadInt16(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedValue);
打破
}
案例类型代码::UInt16:
{
UInt16 managedValue=Marshal::ReadInt16(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedValue);
打破
}
案例类型代码::Int32:
{
Int32 managedValue=Marshal::ReadInt32(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedValue);
打破
}
案例类型代码::UInt32:
{
UInt32 managedValue=Marshal::ReadInt32(IntPtr(pNativeObject));
pArrayIterator->SetValue(pManagedArray,managedValue);
打破
}
案例类型代码::Int64:
{
Int64管理