Я получаю следующую ошибку:
"COM object that has been separated from its underlying RCW cannot be used."
Я уверен, что проблема в том, что COM-объект вызывается не в том потоке, в котором он был создан - STA.Я попытался реализовать IDisposable, но он не сработал для меня.
Есть пара постов, посвященных аналогичной проблеме, но которые все еще не решают мою проблему:
Безопасно ли этовызвать RCW из финализатора? Разблокировать объект Excel в моем деструкторе
Может ли кто-нибудь опубликовать пример / объяснить, как правильно получить доступ к COM-объекту из другого потока?
Вот минимальный код, который показывает проблему:
using System;
using System.Threading;
namespace Test.ComInterop
{
public class Program
{
MyCom _myCom;
[STAThread]
static void Main( string[] args )
{
new Program();
}
public Program()
{
_myCom = new MyCom();
// this method call works
string version = _myCom.ComMethod();
StartThread();
}
private void StartThread()
{
Thread t = new Thread( UIRun );
t.SetApartmentState( ApartmentState.STA );
t.Start();
}
void UIRun()
{
TestUI window = new TestUI();
window.Show();
// this method call fails
window.Title = _myCom.ComMethod();
window.Closed += ( sender2, e2 )
=> window.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
}
}
class MyCom
{
private dynamic _com;
public MyCom()
{
_com = Activator.CreateInstance(
Type.GetTypeFromProgID( "Excel.Application" ) );
}
public string ComMethod()
{
return (string) _com.Version;
}
}
}