2012-03-20 11 views
3

私は、生成されたテキストの電子メールを人々が送信できるようにするアプリケーションのセクションがあります。現在の問題は、ユーザーがOutlookをインストールしていないときに、テキストをフォームにロードすると、処理されない例外System.IO.FileNotFoundがスローされることです。フォームの読み込み時に、私はOutlookがインストールされているかどうかを判断しようとします。OutlookがC#例外処理でインストールされているかどうかのテスト

try{ 
     //Assembly _out = Assembly.Load("Microsoft.Office.Interop.Outlook"); 
     Assembly _out = Assembly.Load("Microsoft.Office.Interop.Outlook, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"); 
     //Microsoft.Office.Interop.Outlook.Application _out = new Microsoft.Office.Interop.Outlook.Application(); 
     //Microsoft.Office.Interop.Outlook.Application _out = new Microsoft.Office.Interop.Outlook.Application(); 
    } 

上記は私が試したコードです。私が開発しているコンピュータでは、アセンブリ名がオフの場合、catch文がそれをキャッチします。しかし、見通しのないXPマシンでテストすると、エラーがスローされ、フォームイベントのロードが停止します。

私は(すべてでも動作しませんでしたキャッチ)しようとしているすべてのcatch文:

 catch (System.IO.FileLoadException) 
     { _noOutlook = true; type = "FILE-LOAD"; } 
     catch (System.IO.FileNotFoundException) 
     { _noOutlook = true; type = "FILE-NOT-FOUND"; } 
     catch (System.IO.IOException) 
     { _noOutlook = true; type = "IO"; } 
     catch (System.Runtime.InteropServices.COMException) 
     { _noOutlook = true; type = "INTEROP"; } 
     catch (System.Runtime.InteropServices.InvalidComObjectException) 
     { _noOutlook = true; type = "INTEROP-INVALIDCOM"; } 
     catch (System.Runtime.InteropServices.ExternalException) 
     { _noOutlook = true; type = "INTEROP-EXTERNAL"; } 
     catch (System.TypeLoadException) 
     { _noOutlook = true; type = "TYPELOAD"; } 
     catch (System.AccessViolationException) 
     { _noOutlook = true; type = "ACCESVIOLATION"; } 
     catch (WarningException) 
     { _noOutlook = true; type = "WARNING"; } 
     catch (ApplicationException) 
     { _noOutlook = true; type = "APPLICATION"; } 
     catch (Exception) 
     { _noOutlook = true; type = "NORMAL"; } 

私はOutlook 2010のために働くために一つのコードを使用することができますので、うまくいけば(動作する方法を探しています& 2007)。レジストリ/正確なファイルパスを確認する必要はありません。

私は、XPでエラーが発生してもキャッチしないのはなぜですか?なぜなら、XPNはキャッチしたときにFileNotFoundをスローし、Outlookのinteropオブジェクト働くでしょう。

答えて

3

私は2007年にインストールされたXPマシンを持っています。それゆえ、私はすべての場合についてテストすることができませんでした。しかし、このコードはうまくいくようです。

public static bool IsOutlookInstalled() 
{ 
    try 
    { 
     Type type = Type.GetTypeFromCLSID(new Guid("0006F03A-0000-0000-C000-000000000046")); //Outlook.Application 
     if (type == null) return false; 
     object obj = Activator.CreateInstance(type); 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
     return true; 
    } 
    catch (COMException) 
    { 
     return false; 
    } 
} 
+0

これは魅力のように働いた、ありがとうございます。それは、OutlookなしでOutlook 2010とXPでWindows 7で動作しました。 – UnholyRanger

0
public bool IsOutlookInstalled() 
{ 
    try 
    { 
     var officeType = Type.GetTypeFromProgID("Outlook.Application"); 
     if (officeType == null) 
     { 
      // Outlook is not installed. 
      return false; 
     } 
     else 
     { 
      // Outlook is installed.  
      return true; 
     } 
    } 
    catch (System.Exception ex) 
    { 
     return false; 
    } 
}