2009-06-30 8 views
1

Wir haben ein Szenario, in dem einige .NET-Code versucht, auf die aktuelle Instanz eines COM (eigentlich DCOM) -Objekts zuzugreifen.Wenn Sie Marshal.GetActiveObject (Klassen-ID hier) aufrufen, was würde den Fehler 800401E3 (Operation Unavailable) verursachen?

Das Objekt, auf das zugegriffen wird, wurde in VB6 entwickelt. Eine aktuelle Instanz davon ist auf dem Remote-System verfügbar und scheint korrekt aus VB6-Code aufgerufen zu werden.

Wenn versucht wird, Marshal.GetActiveObject aufzurufen und den Klassennamen anzugeben, wird eine COMException ausgelöst, die auf den Fehler 800401E3 (Operation Unavailable) verweist.

Derselbe .NET-Code scheint ordnungsgemäß zu funktionieren, wenn auf dem Computer ausgeführt wird, der diese DCOM-Komponente hostet.

Kann jemand vorschlagen, warum diese COMException generiert wird?

Antwort

1

Haben Sie versucht, das Attribut [STAThread] in der DotNet-Client-App zu verwenden?

+0

Da die .NET-Client-Anwendung eine WinForms-Anwendung ist, verfügt sie über ein STAThread-Attribut. Der Aufruf von GetActiveObject befindet sich jedoch in einer DLL, was nicht der Fall ist. Ich habe Verifizierung kurz vor dem GetActiveObject-Aufruf hinzugefügt, um sicherzustellen, dass der Thread, der die DLL-Methode aufruft, STA verwendet. Bisher wurden anscheinend keine Aufrufe an die Methode von einer Anwendung mit einem nicht unterstützten Threading-Modus getätigt. –

+0

Es scheint, als ob Sie auf etwas sind. Wir haben nun bestätigt, dass es einen anderen Client gibt, der von einem MTA-Thread in die DLL aufruft. –

+0

Während wir immer noch gelegentlich auf das Problem stoßen, scheint es, dass es fast sicher Thread-bezogen ist. Als Ergebnis setze ich diese Antwort als die "richtige", obwohl es möglicherweise noch ein anderes Szenario gibt, das das gleiche Symptom verursacht. –

Verwandte Themen