web-dev-qa-db-ja.com

WatiN:Internet Explorerを自動化するには、CurrentThreadのApartmentStateをApartmentState.STAに設定する必要があります。

C#WindowsサービスからWatiNを呼び出しています。 WatiNを呼び出すと、次の例外がスローされます。 Internet Explorerを自動化するには、CurrentThreadのApartmentStateをApartmentState.STAに設定する必要があります。

スレッドを起動してアパートの状態を設定してみました

mythread.SetApartmentState(ApartmentState.STA)

しかし、それは別のエラーになりました

コードが最適化されているか、ネイティブフレームが呼び出しスタックの最上位にあるため、式を評価できません。

また、サービスエントリポイントに属性を追加してみました。

static class Program
{
      [STAThread]
      static void Main()
      {
          ...

何か案は?

25
Jonathan

ベンジャミンがすでに「実用的な」回答を投稿していることは知っていますが、WatiNテストを実行しようとしたときにこのエラーが発生したときに経験したことをいくつか追加すると思いました。NUnitの場合は、次のようなものを追加する必要があります。テスト用のapp.config:

  <configSections>
    <sectionGroup name="NUnit">
      <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
    </sectionGroup>
  </configSections>
  <NUnit>
    <TestRunner>
      <!-- WatiN can only Host IE in STA mode -->
      <add key="ApartmentState" value="STA"/>
    </TestRunner>
  </NUnit>

MbUnitで、TestFixture属性を次のように変更します。

[TestFixture(ApartmentState = ApartmentState.STA)] 

HTH、ピート。

ハ-それは実際にはドキュメントにあります。ドー! http://watin.org/documentation/sta-apartmentstate/

18
Pete Morgan

これはエラーではなく、デバッガーからの単なる診断です。ウォッチウィンドウに何を入れてもデバッグ情報を提供できないことを示しています。これはリリース構成でコンパイルされるコードと共通であり、JITコンパイラーはマシンコードを最適化し、通常はローカル変数をCPUレジスターに配置します。それらの値をデバッガーが使用できないようにすると、どのレジスターが使用されたかを把握するのに十分なほど賢くはありません。コールスタックにアンマネージコードがある場合、デバッグリリースでも発生することがあります。これはWebBrowserにとって珍しいことではありませんが、それを機能させるアンマネージコードの非常に大きなチャンクがあります。

FWIW、スレッドのアパートメント状態をSTAに切り替えるだけでは不十分です。スレッドは、シングルスレッドのアパートメントを適切に動作させるために、Windowsメッセージループもポンプする必要があります。そうしないと、WebBrowserなどのSTAオブジェクトに対する操作がデッドロックすることがわかります。たとえば、サイトに移動したときにDocumentCompletedイベントが発生することはありません。メッセージループを実行するには、WFアプリでApplication.Run()またはForm.ShowDialog()を呼び出す必要があります。

8
Hans Passant

このエラーを確認するために使用した属性は次のとおりです。[TestFixture、RequiresSTA]

Adrianbanksによると、次のように答えます。 STAThreadモードでユニットテストを実行する方法は?

3
Mike