#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;
}