2012-09-28 21 views
0

據我所知,預處理指令是適當的位置,基於這樣一個問題: Preprocessor directive in C# for importing based on platform如何在WinXP上使用Microsoft.Interop.Excel版本11,如何在Win7上使用版本12?

原因是Visual Studio抱怨,在我的命名空間的開始

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

簡單的複製粘貼不工作

屬性'DLLImport'在此聲明類型上無效。它只在'方法'聲明中有效

但是,將#else行更改爲#elif WIN32使它能夠編譯。

我該如何將這種基於操作系統的不同DLL加載到版本11和版本12的Microsoft.Office.Interop.Excel的特定情況下?

+0

也許你不得不在編譯期間,但在運行期間這樣做。 .NET 4具有'dynamic'關鍵字。在以前的版本中,我成功地使用了Reflection來調用Office COM類的方法。 –

+1

預處理器指令在您構建解決方案時起作用,而不是在您部署解決方案時發揮作用,所以我不知道它們會按照您的預期行事。 –

+0

聽起來就像你在錯誤的地方得到了DllImport。它可能會在你添加'#elif WIN32'的時候生成,因爲這些常量的定義都沒有定義,所以它根本不添加代碼。 –

回答

1

如果您想在編譯時鏈接到一個特定版本(如您所示的建議) - 您需要有2個項目將包含不同版本的Interop程序集並引用同一組源文件。

如果你想在運行時使用它並使用強類型對象,你需要包裝你感興趣的方法,並通過你的自定義類/接口公開它們,因爲互操作程序集不共享任何基類(兄弟姐妹,而不是11,如你所願,是父母的12)。

相關問題