Как включить Microsoft.Interop.Excel версии 11 в WinXP и версии 12 в Win7?

Я понимаю, что здесь уместны директивы препроцессора, исходя из этого вопроса: директива препроцессора в С# для импорта на основе платформы

Простая копипаста

#if WIN64
    [DllImport("ZLIB64.dll", CallingConvention=CallingConvention.Cdecl)]
#else
    [DllImport("ZLIB32.dll", CallingConvention = CallingConvention.Cdecl)]
#endif

в начале моего пространства имен не работало, потому что Visual Studio жалуется, что

Атрибут «DLLImport» недопустим для этого типа объявления. Он действителен только для объявлений «метода».

Однако изменение строки #else на #elif WIN32 заставило ее скомпилироваться.

Как бы я применил этот метод загрузки разных библиотек DLL в зависимости от операционной системы к этому конкретному случаю Microsoft.Office.Interop.Excel для версии 11 по сравнению с версией 12?


person Pat Needham    schedule 28.09.2012    source источник
comment
Вероятно, вам нужно сделать это не во время компиляции, а во время выполнения. В .NET 4 есть ключевое слово dynamic. В предыдущих версиях я успешно использовал Reflection для вызова методов COM-классов Office.   -  person Uwe Keim    schedule 28.09.2012
comment
Директивы препроцессора вступают в действие, когда вы создаете решение, а не когда вы разворачиваете решение, поэтому я не уверен, что они будут делать то, что вы ожидаете.   -  person D Stanley    schedule 28.09.2012
comment
Похоже, у вас есть DllImport не в том месте. Вероятно, он создается, когда вы добавляете #elif WIN32, потому что НИ ОДНА из этих констант не определена, поэтому он вообще не добавляет код.   -  person D Stanley    schedule 28.09.2012
comment
@UweKeim работает на .NET 3.5   -  person Pat Needham    schedule 28.09.2012
comment
@DStanley, что покрывает случай развертывания? VS не позволит мне опубликовать, если есть ошибки сборки, а у меня 64-разрядная версия Windows 7.   -  person Pat Needham    schedule 28.09.2012


Ответы (1)


Если вы хотите связать одну конкретную версию во время компиляции (как предлагает ваш пример), вам нужно иметь 2 проекта, которые будут включать разные версии сборки Interop и ссылаться на один и тот же набор исходных файлов.

Если вы хотите сделать это во время выполнения и использовать строго типизированные объекты, вам нужно будет обернуть интересующие вас методы и предоставить их через ваши пользовательские классы/интерфейсы, потому что сборки взаимодействия не используют какие-либо общие базовые классы (братья и сестры вместо 11). является родителем 12 детей, как вы можете пожелать).

person Alexei Levenkov    schedule 28.09.2012