Excelのプロセスが終了しない

C++/CLIでExcel.netを遠隔操作した際にExcelのプロセスが終了せず、少々嵌ってしまいました。
コードは以下の通り。

// sheetは既にopen済
System::Object^ cells = this->_excel->GetType()->InvokeMember("Cells", System::Reflection::BindingFlags::GetProperty, nullptr, sheet, nullptr);
if(cells != nullptr) {
  this->_excel->GetType()->InvokeMember("Item",   System::Reflection::BindingFlags::SetProperty, nullptr, cells, gcnew array<System::Object^> {row, col, gcnew System::String(v)});
  System::Runtime::InteropServices::Marshal::ReleaseComObject(cells);
}
// sheetをclose and release

Comオブジェクトを解放しているのに何故でしょうか…。
どうやらExcel側で暗黙のオブジェクトが生成されているようです。
おそらくItemオブジェクトが暗黙に生成され、この暗黙オブジェクトに対し値が代入されているようです。
この暗黙オブジェクトの参照カウンタが減らないのでExcelを解放できないのでしょう。
以下のように暗黙オブジェクトが生成されないようにすることでExcelプロセスが終了するようになりました。

// sheetは既にopen済
System::Object^ cells = this->_excel->GetType()->InvokeMember("Cells", System::Reflection::BindingFlags::GetProperty, nullptr, sheet, nullptr);
if(cells != nullptr) {
  System::Object^ cell = this->_excel->GetType()->InvokeMember("Item", System::Reflection::BindingFlags::GetProperty, nullptr, cells, gcnew array<System::Object^> {row, col});
  if(cell != nullptr) {
    this->_excel->GetType()->InvokeMember("Value2",    System::Reflection::BindingFlags::SetProperty, nullptr, cell, gcnew array<System::Object^> {gcnew System::String(v)});
    System::Runtime::InteropServices::Marshal::ReleaseComObject(cell);
  }
  System::Runtime::InteropServices::Marshal::ReleaseComObject(cells);
}
// sheetをclose and release

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です