Excel-DNA действительно должен значительно упростить преобразование Excel C ++ в .NET.
Вам следует быть осторожным, пытаясь смешать VSTO и Excel-DNA.Они не живут вместе счастливо в одной и той же надстройке, поэтому вы должны либо основывать все на Excel-DNA (что дает вам доступ как к C API, так и к интерфейсам COM), либо создавать две отдельные надстройки (VSTO имеетнекоторые ленты и другие высокоуровневые обертки, которые могут быть удобны.)
Для доступа к API C из Excel-DNA вы используете класс XlCall, как вы заметили, вместе с классом ExcelReference, который содержит информацию изссылочный тип XLOPER.С Excel-DNA вам никогда не придется иметь дело с XLOPER явно, все преобразования типов выполняются автоматически при вызове XlCall.Excel (...).
Не следует путать вспомогательный тип C API ExcelReference,с типом COM Range.Вы можете конвертировать туда и обратно, но они не являются взаимозаменяемыми.Для вызовов API C вам нужен тип ExcelReference.
Обращаясь к вашему примеру, неясно, что такое controllerRange, но я предполагаю, что тип xlr тип является эквивалентом типа ExcelReference Excel-DNA, а не COM.Тип диапазона, который вы используете (как Excel.Range).Вот сообщение о преобразовании между ExcelReference и Range: http://groups.google.com/group/exceldna/browse_frm/thread/7a16e20e9067d3d2.
Когда у вас есть ExcelReference, ваши звонки верны.Так что это должно работать:
m_pControllerReference = new ExcelReference(0,0,0,0, "Sheet1"); // Cell A1
m_referenceSheetName = (string)XlCall.Excel(XlCall.xlSheetNm, m_pControllerReference );
m_controllerSheetId = XlCall.Excel(XlCall.xlSheetId, m_referenceSheetName);
// or just:
m_controllerSheetId = m_pControllerReference.SheetId;
Теперь я не уверен, что делает ваша последняя строка - похоже, создается еще один объект xlr.В ExcelReference есть свойства RowFirst, RowLast, которые вы использовали бы для проверки количества строк.