Превосходное управление памятью c API

#memory-management

#управление памятью

Вопрос:

Я пытаюсь вызвать xlfCaller из ExcelDNA методом XlCall.TryExcel, я иногда получал XlReturnStackOvfl, я нашел кое-что для этой проблемы: 1. на этом сайте: https: //learn.microsoft.com/en-us/office/ client-developer/excel/ xlfcaller, говорится, что мы должны вызывать xlFree после xlfCaller, 2. на https://docs.excel-dna.net/excel-c-api /, этопоказывает, что «Excel-DNA заботится обо всех преобразованиях типов и управлении памятью для вызовов C API»., Поэтому мне интересно, нужно ли мне вызывать xlFree?

Ответ №1:

ExcelDNA всегда вызывает xlFree после вызова API excel c, поэтому нам не нужно снова вызывать xlFree.Ниже приведен исходный код ExcelDNA:

 private unsafe static int TryExcelImpl4(int xlFunction, out object result, params object[] parameters)
    {
        int xlReturn;

        // Set up the memory to hold the result from the call
        XlOper resultOper = new XlOper();
        resultOper.xlType = XlType.XlTypeEmpty;
        XlOper* pResultOper = amp;resultOper;  // No need to pin for local struct

        // Special kind of ObjectArrayMarshaler for the parameters (rank 1)
        using (XlObjectArrayMarshaler paramMarshaler = new XlObjectArrayMarshaler(1, true))
        {
            XlOper** ppOperParameters = (XlOper**)paramMarshaler.MarshalManagedToNative(parameters);
            xlReturn = Excel4v(xlFunction, pResultOper, parameters.Length, ppOperParameters);
        }

        // pResultOper now holds the result of the evaluated function
        // Get ObjectMarshaler for the return value
        ICustomMarshaler m = XlObjectMarshaler.GetInstance("");
        result = m.MarshalNativeToManaged((IntPtr)pResultOper);
        // And free any memory allocated by Excel
        Excel4v(xlFree, (XlOper*)IntPtr.Zero, 1, amp;pResultOper);
    
        return xlReturn;
    }