На самом деле более вероятно, что версия времени выполнения, которая представляет проблему совместимости, а не PIA.
Когда он запускается на чьей-то машине с 2007 годом, он взрывается, предположительно из-за различных версий сборок Interop.
Я знаю, что это может «ощущаться» таким образом, но такой сценарий маловероятен. PIA для Excel 2007 шире, чем PIA 2003 г., а не уже. Могут быть добавлены типы, члены и необязательные параметры, но старые сигнатуры 2003 останутся без изменений. Следовательно, все ваши старые вызовы 2003 года будут работать одинаково независимо от того, работают ли они через PIA 2003 или 2007. Конечно, это не гарантировано на 100%, но я предполагаю, что это, вероятно, около 99,8% или около того.
Я надеялся, что кто-то знает способ динамически изменять, откуда / куда загружается сборка, в зависимости от офисной версии (получить офисную версию легко из реестра).
Вам нужно будет использовать отражение, например, сборку . LoadFrom. Но я действительно не думаю, что вам нужно идти этим путем, честно. Фактически, чтобы доказать это, вы должны изменить ссылку в вашей сборке на версию 2007 года, скомпилировать ее и затем запустить. Готов поспорить, что вы получите ту же самую ошибку.
Но почему это могло быть? И как бы вы это исправить?
Проблем совместимости между объектной моделью Excel 2003 и Excel 2007 немного, но они есть. Одним из примеров является свойство Range.Cells.Count
, которое возвращает Int32 с максимальным значением +4,3 млрд. (приблизительно). Однако с учетом гораздо больших листов, представленных в Excel 2007, количество ячеек в электронной таблице фактически составляет около 17,2 миллиарда. Поэтому Range.Cells.Count
выдает исключение, если диапазон слишком велик (например, включает весь рабочий лист). Вместо этого вы должны вызвать Range.Cells.CountLarge
, который, поскольку он возвращает Int64, может обрабатывать больший результат.
Таким образом, на самом деле проблема совместимости, скорее всего, связана с версией времени выполнения, а не с PIA. Таким образом, вы должны изолировать строку, которая генерирует исключение, и сообщить нам, что это за сообщение об ошибке. Тогда, может быть, мы сможем помочь ...
- Майк
person
Mike Rosenblum
schedule
27.05.2010