Как указать необходимую версию Microsoft.Office.Interop.Excel ?

Colt

Ситуация:На машине, где компилируется проект стоят: - C# express 2008 - MS Office 2003 - MS Office 2007На машинах пользователей может стоять только MS Office 2003 под WinXP.В программе используется работа с Excel через Interop. Отсюда желание, чтобы программа использовала Interop именно под версию MS Office 2003.Проблема:Даже при указании подключения ссылки на Excel версии 2003, при запуске у пользователей программа ругается на невозможность загрузки Excel версии 2007.Обратил внимание, что свойство ссылки выглядит несколько странно (см. рисунок): данные, помеченные зеленым, относятся к версии 2003, а помеченные красным к 2007.Вопрос:Как можно (если можно) указать, что необходимо использовать именно 2003 версию?
24 ответа

Colt

Colt,Может наоборот?Пусть ищет сама наиболее подходящую версию?


Colt

Petro123,Так я разве же против? Вся засада в том (как я предполагаю), что на этапе компиляции принимается решение что самая подходящая версия 2007 и потом, уже у пользователя, прога требует именно 2007, а на имеющуюся в наличии 2003 версию слюной плюет.Вот мне и хочется знать, как еще при компиляции объяснить, что не надо зацикливаться на версии 2007.


Colt

Colt, спесифик версион = труе


Colt

Colt, спесифик версион = труе
Как понимаю, тогда ищется именно та что при разработке?А у него почему максимальная не работает?


Colt

Colt,OFF зачем тебе два офиса на машине для продакшена компиляции?


Colt

Colt,Лучше ручками писать загрузку.Я на stackoverflow находил пример.Заодно решается проблема выбора версии - какой Ексель есть, такой и запустится.В принципе, у себя на дев.машине снеси новый Эксель и поставь старый. Так привяжется жестко к 2003 версии.Только с другими работать не будет.


Colt

Только с другими работать не будет
Не верю. В интерфейсах должно быть так же как с Net.


Colt

buser, не совсем понял, что именно вы имели ввиду? Где именно этот самый "специфик", который можно выставить в "тру"?


Colt

Siemargl, вы имеете в виду позднее связывание? Если да, то действительно, это может решить проблему с жесткой прошивкой версии. Правда добавляется куча других проблем, присущих позднему связыванию, которых хотелось бы избежать.


Colt

что на этапе компиляции принимается решение что самая подходящая версия 2007
На машине компиляции должна быть нижняя версия.Как в net supported Runtime. Тогда у клиента прицепит наиболее старшую.Проверьте.


Colt

Colt,OFF зачем тебе два офиса на машине для продакшена компиляции?
Увы и ах, я работаю не в софтостроительной компании. Скорее это из раздела "а еще я немного программирую". Потому, с некоторых пор, office 2003 уже совсем перестал удовлетворять потребности, пришлось перейти на 2007.Раз уж пошла такая беседа дам немного своей истории.Когда у меня стоял только 2003, то прога запускалась без проблем на всех окружающих компах, даже включая те, на которых стоял 2007 (т.е. совместимость в эту сторону Interopt поддерживал).Когда меня обуяла гордыня и я снес 2003 поставив вместо него 2007, то (после перекомпиляции) прога стала ругаться на отсутствие библиотек от 2007 на машинах, где стоит только 2003. В качестве костыля я пока рядом с экзешником положил Microsoft.Office.Interop.Excel.dll, Microsoft.Vbe.Interop.dll и office.dll от 2007. Машины перестали ругаться и даже стали нормально (пока) работать. Но это сильно костыль, который мне не нравиться и вообще удивительно, что сработало.На текущий момент я пытаюсь понять как (если это возможно) имея на машине, где все компилиться, две версии офиса убедить c# пользоваться той, что помладше. (Это еще одна причина, почему у меня пока стоит два офиса).Но у меня такое ощущение, что нормального решения моей проблемы нет и единственный более-менее приемлемый выход - завести отдельную машину под компиляцию, где будет стоять только офис 2003 (а может и вовсе 2000), как и предлагали товарищи выше.


Colt

На машине компиляции должна быть нижняя версия.Как в net supported Runtime. Тогда у клиента прицепит наиболее старшую.Проверьте.
И я тоже так думал. Но, видимо, цепляние библиотек и цепляние СОМ-объектов (сорри, если коряво выразился) имеет между собой некоторые различия.Обратите внимание на рисунок из первого поста: там, при цеплянии, я указываю как раз младшую версию, причем явно, но уже в свойствах ссылки видно, что по факту цепляется dll от старшей версии.


Colt

Обратите внимание на рисунок из первого поста: там, при цеплянии, я указываю как раз младшую версию, причем явно, но уже в свойствах ссылки видно, что по факту цепляется dll от старшей версии.
Т.е. механизм com тот же. Просто проверьте что я писал выше.Есть целевая среда, а есть среда компиляции.Вы же не проверили.


Colt

Не верю. В интерфейсах должно быть так же как с Net.
В теории да. Но так получалосьНа дев-виртуалке у меня совсем никакого Excel-я нет.Так что грузилось ручками assembly.load, а с подменой что то не срабатывало.Уже подробности на память не воспроизведу - надо подымать версии.


Colt

Уже подробности на память не воспроизведу - надо подымать версии.
Вот я поэтому и говорю автору в 15 раз проверить юзкейс.Мы не можем в IT ручками в динамике грузить офис.Либо MS настолько дурак.


Colt

Мы не можем в IT ручками в динамике грузить офис.Либо MS настолько дурак.
Если речь про com-interop враппер для офиса - еще как можем, т.к. это обычная дотнетовская сборка, для которых Assebly.LoadFrom никто не отменял..И да, чтобы сборка нужной версии подцеплялась у клиента, нужно, чтобы она у него была. Поскольку в случае ТС при компиляции сборка враппера берется из ГАКа, и локально не копируется, то, если у клиента никогда не ночевало 2003-го офиса (вот как у меня сейчас, например) - откуда этой сборке взяться? Соответственно, поставить Copy Local=True, Embed Interop Types=False, и распространять сборку враппера нужной версии вместе с приложением. Ну, и про перенаправление версий, упомянутое выше, не забывать.


Colt

Сон Веры Павловны,Очень давно при работе с COM было так:Itemp = CreateCOMObject ("ADO");Соответственно из реестра брался последний по версии объект.В данном сабже не так?Тогда нафига эта технология interopxxxxx?Я фигею.Это ведь дико неудобно?Откудя я знаю версию офиса у заказчика? Ен


Colt

если у клиента никогда не ночевало 2003-го офиса (вот как у меня сейчас, например) - откуда этой сборке взяться?
При поиске Net ведь работает?Есть вариант - загрузить максимальную.


Colt

При поиске Net ведь работает?Есть вариант - загрузить максимальную.
Что работает? Поиск сборки, которой никогда не было на компьютере? И что-то находится? И есть уверенность, что это именно та самая версия?


Colt

Что работает? Поиск сборки, которой никогда не было на компьютере? И что-то находится? И есть уверенность, что это именно та самая версия?
Net проект скомпиленный у меня с net 4.5 не будет работать у зказчика с net 4.6?


Colt

Сон Веры Павловны,Атрибут version, sku в конфиге определяют общие версии Net напр. От 4 до 4.7.Логично предположить для офиса нечто подобное.


Colt

Логично предположить для офиса нечто подобное.
А мне - совсем нелогично: технология СОМ намного более старая, чем .Net, и давно уже не менялась. Ну, и еще я знаю, как загружаются и активируются COM-компоненты в .Net - всё по тем же CLSID, которые берутся либо из атрибутов интерфейсов PIA-сборки, либо из внедренных кусков PIA-сборки при выбранной опции Embed Interop Types=True. И в том, и в другом случае активация делается по CLSID, и никаких sku или чего-либо подобного там и в помине нет.


Colt

Сон Веры Павловны,Давай как потребители рассуждать.- с Net линейка версий работает? Да!- Это удобно? Да!Почему в офисе ВОЗМОЖНО не работает.Ждём теста автора топика.