わかりました。Outlookクラス(それ自体はシングルトンafaikです)を操作するために、自分自身をシングルトンとしてMailServiceクラスにするのは良い考えのように思えました。
最初はうまく機能しましたが、appserviceレイヤーからこのクラスの単体テスト(MS単体テスト)を設定しようとすると、すべてが壊れて、RuntimeCallableWrapperエラーが発生しました。
MailServiceクラスをシングルトンとして設定するのは間違っていましたか、それともOutlookをシングルトンクラスとしてラップする際に何か間違ったことをしていましたか?
これは、次のいずれかのメソッドを持つ私のMailserviceクラスです。
public class MailService : IDisposable
{
private static MailService _instance;
private Outlook.ApplicationClass _app;
private Outlook.NameSpace _olNS;
private MailService()
{
_app = new Outlook.ApplicationClass();
_olNS = _app.GetNamespace("MAPI");
}
public static MailService Instance
{
get
{
if (_instance == null)
_instance = new MailService();
return _instance;
}
}
public void Dispose()
{
_app.Quit();
Marshal.ReleaseComObject(_app);
GC.Collect();
GC.WaitForPendingFinalizers();
}
public Outlook.Folder getFolderByPath(string sFolderPath)
{
Outlook.Folder olFolder = null;
if (sFolderPath.StartsWith(@"\\"))
{
sFolderPath = sFolderPath.Remove(0, 2);
}
string[] sFolders = sFolderPath.Split('\\');
try
{
olFolder = _app.Session.Folders[sFolders[0]] as Outlook.Folder;
if (olFolder != null)
{
for (int i = 1; i <= sFolders.GetUpperBound(0); i++)
{
Outlook.Folders subFolders = olFolder.Folders;
olFolder = subFolders[sFolders[i]] as Outlook.Folder;
if (olFolder == null)
{
return null;
}
}
}
return olFolder;
}
catch (Exception e)
{
LogHelper.MyLogger.Error("Error retrieving " + sFolderPath, e);
return null;
}
}
}
私のMS単体テストは個別に機能していますが、すべてをテストリストで実行している場合は機能しません。後者の条件では、最初のテストのみが合格しました...
[TestMethod]
public void TestMonitorForCleanUpDone()
{
Assert.IsNotNull(MailService.Instance.getFolderByPath(olFolderDone));
}
[TestMethod]
public void TestMonitorForCleanUpIn()
{
Assert.IsNotNull(MailService.Instance.getFolderByPath(olFolderIn));
}