2011-02-18 28 views
4

我有一個C#項目,我想訪問MS Outlook,如果它安裝在客戶端的機器上。 「訪問前景」部分是通過引用outlook COM對象完成的,並從那裏開始。我的問題現在是「如果它已安裝」的一部分。目前,我的項目不會在沒有安裝Outlook的機器上編譯,所以我假設我將不必引用Outlook組件,而是在檢測到存在前景後動態加載和使用它,但是我沒有找到了一個方法來做到這一點。我是否正確,是否有人提示如何做到這一點?動態加載並使用COM對象在C#

謝謝。

編輯:已解決。按照Hans Passant在關於使用辦公室PIA的評論中提出的建議,被證明是阻力最小的路徑。我在沒有辦公室的機器上獲得PIA時有點困難,但是使用this問題的接受答案克服了這個問題。

+0

Ciao Boris,我擔心你將開發環境與部署環境混合在一起。在開發中你應該引用正確的程序集,這些程序集應該可用於構建代碼。在生產中,您不必構建任何東西,但是您的程序需要安裝Outlook。 – 2011-02-18 12:50:31

+0

@Davide Piras:我認爲你是過度使用你的編輯和重新標記特權... – 2011-02-18 12:52:05

回答

1

按照Hans Passant的建議,我現在回答我自己的問題,並提供解決方案的詳細信息。我能夠在未安裝辦公室的情況下在計算機上編譯和運行我的項目。主要問題是讓visual studio知道,它可以從COM對象期望的接口。這是通過查找主界面組件(PIA)文件來解決的。這個過程在this問題更好地描述,但短期的故事是,我已經在我的電腦上的Office PIA的,在此位置:

C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA 

我用VS2010親,我不知道如果文件包含在其他版本中。然後是將相關文件複製到我的項目源文件夾中,包括它在我的項目和源代碼控制中,並對其進行參考。之後,我可以在我的項目中使用Outlook COM類型,並且無錯地進行編譯。我也能夠在沒有安裝辦公室的情況下運行我的項目。這是通過嘗試實例化相關的COM對象,並在未安裝office的情況下捕獲異常來實現的。以下示例代碼顯示瞭如何:

using Outlook = Microsoft.Office.Interop.Outlook; 

namespace Foo 
{ 
    public class Bar 
    { 
     public void Quux() 
     { 
      try 
      { 
       // try to instantiate outlook COM object. 
       Outlook.Application outlookApp = new Outlook.Application(); 

       // if it works, fine. Proceed 
       ... 
      } 
      // If we catch a COMException, assume no office installed. Deal accordingly. 
      catch (System.Runtime.InteropServices.COMException) 
      { 
       ... 
      } 
     } 
    } 
} 
2

如果沒有Outlook COM對象存在,您肯定無法在機器上編譯程序集,但這並不意味着您的應用程序將完全無法在沒有Outlook的計算機上運行 - 只是嘗試創建或使用Outlook COM對象將導致引發失敗/異常。

根據this question檢測COM對象是否存在的最好方法就是試圖實例化它並在未安裝的情況下捕獲生成的異常。