C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
掲示板トップ
C# と VB.NET のサンプル
新規作成
利用方法/規約
ツリー表示
トピック表示
ランキング
記事検索
過去ログ
■103906
/ 1階層)
c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ 魔界の仮面弁士
(3906回)-(2026/01/14(Wed) 09:02:55)
■
No103858
(いとこんにゃく さん) に返信
> OutlookApp = new Outlook.Application();
> OutookNameSpace = (Outlook._NameSpace)OutlookApp.GetNamespace("MAPI"); <=ここで以下のエラーが出ます。
手元に "Outlook (new)" を動かせる環境が無いうえに、
普段ブラウザ版 Outlook を使っているため、デスクトップアプリ版の
Outlook のオートメーション操作については詳しくありませんが、状況からすると
・NameSpace の dual interface の vtable 側に不整合が起きている
・あるいは TypeLib の参照が正しく解決されていない
といった可能性が考えられます。
Outlook の TypeLib は後方互換性を重視しているため、
実際にインターフェイスが変更されたとは考えにくいのですが、
vtable 側と TypeLib の整合性が崩れたなら「変更されたように見える」挙動になりえます。
原因が Office 側の更新か、Windows 側の更新かは判断が難しいところです。
> ' Outlookアプリのイベント(NewMailEx)に接続
> Dim olApp: Set olApp = WScript.CreateObject("Outlook.Application", "OutApp_")
> Dim olNS : Set olNS = olApp.GetNamespace("MAPI")
> で実行した場合は問題ありません。
VBScript が動くということは、IDispatch (遅延バインディング) 側は正常ということになります。
一方で C# の事前バインディングは vtable (IUnknown) 側を使うため、
dual interface の vtable 側だけが壊れていると、型変換に失敗する可能性があります。
そのため、C# でも dynamic を使った遅延バインディングにした場合は動作するかもしれません。
まず、事前バインディングで取得した Application オブジェクトが
本当に従来 Outlook の CLSID を返しているか確認してみてください。
var app = new Outlook.Application();
// 通常であれば「0006f03a-0000-0000-c000-000000000046」が返される
Console.WriteLine(app.GetType().GUID);
念のため、Marshal.IsComObject(app) が true を返すかも確認しておきましょう。
ちなみに PowerShell の COM 呼び出しは、VBScript 同様、常に IDispatch(遅延バインディング)なので、
C# からの事前バインディング(参照設定で呼び出した場合)とは結果が異なる可能性があります。
$o = New-Object -COM "Outlook.Application"
$o.GetType().Guid # → 0006f03a-0000-0000-c000-000000000046
$n = $o.GetNamespace("MAPI")
$n.GetType().Guid # → 0006308b-0000-0000-c000-000000000046
# 一応、解放処理も書いておく
#
# $objs = @($mail, $items, $folder, $n, $o)
$objs = @($n, $o)
foreach ($obj in $objs) {
if ($obj -ne $null -and [System.Runtime.InteropServices.Marshal]::IsComObject($obj)) {
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($obj) | Out-Null
}
}
# $mail = $items = $folder = $n = $o = $null
$n = $o = $null
比較のため、C# でも遅延バインディングを試してみてください。特に星印の部分です。
(イベント処理も遅延バインドでやろうとすると大変なので、あくまで検証目的ですが)
OutlookApp = new Outlook.Application(); // early-bind
dynamic outlookDynApp = OutlookApp;
dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind
OutookNameSpace = outookDynNameSpace; // ☆
または最初から遅延バインディングで起動する方法:
// OutlookApp = new Outlook.Application();
dynamic outlookDynApp = Activator.CreateInstance(Type.GetTypeFromProgID("Outlook.Application")); // late-bind
dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind
OutookNameSpace = outookDynNameSpace; // ☆
さらに、実際に返ってきた COM オブジェクトの CLSID を確認するには:
IntPtr unk = Marshal.GetIUnknownForObject(outlookDynApp);
object real = Marshal.GetObjectForIUnknown(unk);
Console.WriteLine(real.GetType().GUID);
サポートされる IID を調べる場合は、スタートメニューから
[Visual Studio] > [Developer Command Prompt]
を起動(あるいは管理者起動)し、左ペインから
[Type Libraries] > [Microsoft Outlook 16.0 Object Library]
をダブルクリックすることで確認できます。
・interface
⇒ C# の参照設定で使われる事前バインディング用 (vtable / IUnknown ベース)
・dipinterface
⇒ PowerShell や VBScript 、あるいは C# で dynamic + Activator.CreateInstance で
使われる遅延バインディング用 (IDispatch.Invoke ベース)
※dual interface の場合、事前バインディング では vtable 側が使われます。
> メニューに
> Outlookの他に
> Outlook(new)が出現したことも関係するのかもしれません。
"Outlook (new)" の実体は WebView2 ベースと聞いていますが、
COM オートメーションをどこまでサポートし続けているかは不明です。
試しに "Outlook (new)" を無効化して従来版を強制起動して
挙動が変わるかどうかを確認すると、原因の切り分けに役立つかもしれません。
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Options\General
DisableNewOutlook = 1 (DWORD)
365 導入企業の場合はこちらも参考になるかもしれません。
https://www.prins.co.jp/knowledge/column/20250523-5234/
編集キー/
編集
前の記事
(元になった記事)
次の記事
(この記事の返信)
←c#で outlook 受信トレイ監視が出きなくなった
/いとこんにゃく
→Re[2]: c#で outlook 受信トレイ監視が出きなくなった
/魔界の仮面弁士
上記関連ツリー
c#で outlook 受信トレイ監視が出きなくなった
/ いとこんにゃく
(25/09/08(Mon) 10:56)
#103858
├
Re[1]: c#で outlook 受信トレイ監視が出きなくなった
/ ゆーち
(26/01/13(Tue) 12:34)
#103901
├
Re[1]: c#で outlook 受信トレイ監視が出きなくなった
/ とくま
(26/01/13(Tue) 14:02)
#103902
│└
Re[2]: c#で outlook 受信トレイ監視が出きなくなった
/ とくま
(26/01/15(Thu) 17:19)
#103908
└
c#で outlook 受信トレイ監視が出きなくなった
/ 魔界の仮面弁士
(26/01/14(Wed) 09:02)
#103906
←Now
└
Re[2]: c#で outlook 受信トレイ監視が出きなくなった
/ 魔界の仮面弁士
(26/01/16(Fri) 16:19)
#103909
上記ツリーを一括表示
/
上記ツリーをトピック表示
上記の記事へ返信
入力内容にタグは利用できません。
他人を中傷する記事は管理者の判断で予告無く削除されます。
半角カナは使用しないでください。文字化けの原因になります。
名前、コメントは必須記入項目です。記入漏れはエラーになります。
入力内容の一部は、次回投稿時の手間を省くためブラウザに記録されます。
URL は自動的にリンクされます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
名前
(*必須)
E-Mail (任意)
Web サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No103906 (魔界の仮面弁士 さん) に返信 > ■No103858 (いとこんにゃく さん) に返信 >>OutlookApp = new Outlook.Application(); >>OutookNameSpace = (Outlook._NameSpace)OutlookApp.GetNamespace("MAPI"); <=ここで以下のエラーが出ます。 > > 手元に "Outlook (new)" を動かせる環境が無いうえに、 > 普段ブラウザ版 Outlook を使っているため、デスクトップアプリ版の > Outlook のオートメーション操作については詳しくありませんが、状況からすると > > ・NameSpace の dual interface の vtable 側に不整合が起きている > ・あるいは TypeLib の参照が正しく解決されていない > > といった可能性が考えられます。 > Outlook の TypeLib は後方互換性を重視しているため、 > 実際にインターフェイスが変更されたとは考えにくいのですが、 > vtable 側と TypeLib の整合性が崩れたなら「変更されたように見える」挙動になりえます。 > > 原因が Office 側の更新か、Windows 側の更新かは判断が難しいところです。 > > >>' Outlookアプリのイベント(NewMailEx)に接続 >>Dim olApp: Set olApp = WScript.CreateObject("Outlook.Application", "OutApp_") >>Dim olNS : Set olNS = olApp.GetNamespace("MAPI") >>で実行した場合は問題ありません。 > > VBScript が動くということは、IDispatch (遅延バインディング) 側は正常ということになります。 > 一方で C# の事前バインディングは vtable (IUnknown) 側を使うため、 > dual interface の vtable 側だけが壊れていると、型変換に失敗する可能性があります。 > > そのため、C# でも dynamic を使った遅延バインディングにした場合は動作するかもしれません。 > > > まず、事前バインディングで取得した Application オブジェクトが > 本当に従来 Outlook の CLSID を返しているか確認してみてください。 > > var app = new Outlook.Application(); > // 通常であれば「0006f03a-0000-0000-c000-000000000046」が返される > Console.WriteLine(app.GetType().GUID); > > 念のため、Marshal.IsComObject(app) が true を返すかも確認しておきましょう。 > > > ちなみに PowerShell の COM 呼び出しは、VBScript 同様、常に IDispatch(遅延バインディング)なので、 > C# からの事前バインディング(参照設定で呼び出した場合)とは結果が異なる可能性があります。 > > $o = New-Object -COM "Outlook.Application" > $o.GetType().Guid # → 0006f03a-0000-0000-c000-000000000046 > > $n = $o.GetNamespace("MAPI") > $n.GetType().Guid # → 0006308b-0000-0000-c000-000000000046 > > # 一応、解放処理も書いておく > # > # $objs = @($mail, $items, $folder, $n, $o) > $objs = @($n, $o) > > foreach ($obj in $objs) { > if ($obj -ne $null -and [System.Runtime.InteropServices.Marshal]::IsComObject($obj)) { > [System.Runtime.InteropServices.Marshal]::ReleaseComObject($obj) | Out-Null > } > } > > # $mail = $items = $folder = $n = $o = $null > $n = $o = $null > > > 比較のため、C# でも遅延バインディングを試してみてください。特に星印の部分です。 > (イベント処理も遅延バインドでやろうとすると大変なので、あくまで検証目的ですが) > > OutlookApp = new Outlook.Application(); // early-bind > dynamic outlookDynApp = OutlookApp; > dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind > OutookNameSpace = outookDynNameSpace; // ☆ > > または最初から遅延バインディングで起動する方法: > > // OutlookApp = new Outlook.Application(); > dynamic outlookDynApp = Activator.CreateInstance(Type.GetTypeFromProgID("Outlook.Application")); // late-bind > dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind > OutookNameSpace = outookDynNameSpace; // ☆ > > さらに、実際に返ってきた COM オブジェクトの CLSID を確認するには: > IntPtr unk = Marshal.GetIUnknownForObject(outlookDynApp); > object real = Marshal.GetObjectForIUnknown(unk); > Console.WriteLine(real.GetType().GUID); > > > サポートされる IID を調べる場合は、スタートメニューから > [Visual Studio] > [Developer Command Prompt] > を起動(あるいは管理者起動)し、左ペインから > [Type Libraries] > [Microsoft Outlook 16.0 Object Library] > をダブルクリックすることで確認できます。 > > ・interface > ⇒ C# の参照設定で使われる事前バインディング用 (vtable / IUnknown ベース) > > ・dipinterface > ⇒ PowerShell や VBScript 、あるいは C# で dynamic + Activator.CreateInstance で > 使われる遅延バインディング用 (IDispatch.Invoke ベース) > > ※dual interface の場合、事前バインディング では vtable 側が使われます。 > > >>メニューに >>Outlookの他に >>Outlook(new)が出現したことも関係するのかもしれません。 > > "Outlook (new)" の実体は WebView2 ベースと聞いていますが、 > COM オートメーションをどこまでサポートし続けているかは不明です。 > > > 試しに "Outlook (new)" を無効化して従来版を強制起動して > 挙動が変わるかどうかを確認すると、原因の切り分けに役立つかもしれません。 > > HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Options\General > DisableNewOutlook = 1 (DWORD) > > 365 導入企業の場合はこちらも参考になるかもしれません。 > https://www.prins.co.jp/knowledge/column/20250523-5234/
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-