2009-12-23 18 views
25

Tôi đang gọi WatiN từ một dịch vụ C# windows. Khi tôi gọi WatiN nó ném ngoại lệ sau đây. Các CurrentThread cần có nó ApartmentState thiết lập để ApartmentState.STA để có thể tự động hóa Internet ExplorerWatiN: The CurrentThread cần có nó ApartmentState thiết lập để ApartmentState.STA để có thể tự động hoá Internet Explorer

Tôi đã thử khởi động một sợi và thiết lập tình trạng căn hộ qua

mythread.SetApartmentState(ApartmentState.STA) 

nhưng mà kết liễu lỗi

Không thể đánh giá biểu thức vì mã được tối ưu hóa hoặc khung gốc nằm phía trên ngăn xếp cuộc gọi.

Tôi cũng đã thử thêm thuộc tính vào điểm nhập dịch vụ.

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

Bất kỳ ý tưởng nào?

+2

Tôi không hiểu được (đậm) lỗi thứ hai . Bạn có thể hiển thị thêm một số mã không? Tôi đã có một yêu cầu tương tự và tạo ra một chủ đề mới, thiết lập các ApartmentState và gọi .Start() theo sau là .Join() - về cơ bản chỉ làm những thứ ràng buộc STA trong đó - làm việc tốt cho tôi. –

+0

Để làm rõ thêm.Tôi tạo ra một chủ đề trong dịch vụ của tôi và SetApartmentState (ApartmentState.STA) gọi mã WATIN của tôi. Điều đó đã ném ngoại lệ sau đây. – Jonathan

+0

Xin chào Benjamin! Thật vậy, bạn là chính xác! Tôi không tham gia chủ đề của mình. Bạn nên đăng tải là câu trả lời;) – Jonathan

Trả lời

18

Tôi biết Benjamin đã đăng câu trả lời 'đang hoạt động', nhưng tôi nghĩ tôi sẽ thêm một vài điều tôi gặp phải khi tôi gặp lỗi này khi cố gắng thực hiện các kiểm tra WatiN: Đối với NUnit, bạn nên thêm một cái gì đó như thế này để app.config của bạn cho các bài kiểm tra:

<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> 

Trong MbUnit, sửa đổi thuộc tính TestFixture của bạn như thế này:

[TestFixture(ApartmentState = ApartmentState.STA)] 

HTH, Pete.

Ha - thực ra trong tài liệu. Doh! http://watin.org/documentation/sta-apartmentstate/

+3

Đây là câu trả lời hữu ích nhất khi bạn chỉ muốn có được WatiN với IE để làm việc trong dự án thử nghiệm của bạn. Cảm ơn, Pete! – Oliver

+0

Cảm ơn, nó đã làm việc cho tôi! –

+0

cho NUnit 2.5 trở lên không hiệu quả đối với tôi, câu trả lời này đã hoạt động: http://stackoverflow.com/a/5293312/173817 – toni

8

Đó không phải là lỗi, nó chỉ là chẩn đoán từ trình gỡ lỗi. Đó là nói với bạn rằng nó không thể cung cấp cho bạn thông tin gỡ lỗi trên bất cứ điều gì bạn đặt trong cửa sổ xem. Đó là phổ biến với mã được biên dịch trong cấu hình phát hành, trình biên dịch JIT tối ưu hóa mã máy và thường đặt các biến cục bộ trong thanh ghi CPU. Làm cho giá trị của chúng không có sẵn cho trình gỡ lỗi, nó không đủ thông minh để tìm ra thanh ghi nào được sử dụng. Nó đôi khi cũng xảy ra trong bản phát hành Debug khi có mã không được quản lý trên ngăn xếp cuộc gọi. Điều này không phổ biến đối với WebBrowser, có một đoạn mã không được quản lý rất lớn khiến nó hoạt động.

FWIW, chỉ cần chuyển trạng thái căn hộ của chuỗi thành STA là không đủ. Chủ đề cũng phải bơm một vòng lặp tin nhắn Windows để làm cho một căn hộ đơn luồng hoạt động đúng. Nếu không, bạn sẽ thấy rằng các hoạt động trên các đối tượng STA như WebBrowser sẽ bế tắc. Ví dụ: bạn sẽ không bao giờ nhận được sự kiện DocumentCompleted khi bạn điều hướng đến một trang web. Chạy một vòng lặp tin nhắn đòi hỏi phải gọi Application.Run() hoặc Form.ShowDialog() trong một ứng dụng WF.

+0

Điều đó tạo ra rất nhiều ý nghĩa! – Jonathan

+0

Cảm ơn rất nhiều. Tham gia chuỗi đã giúp giải quyết vấn đề! – Jonathan

Các vấn đề liên quan