2016-07-20 15 views
5

Tôi có một số mã VB6 tôi cần phải chuyển dần sang .NET. Một số điều này yêu cầu cuộc gọi đến web. Tôi đang thực hiện cuộc gọi web từ một dll .NET, và khi nó được thực hiện, nó sẽ kích hoạt một sự kiện. Tôi xử lý sự kiện trong VB6. Bây giờ điều này hoạt động tốt trên máy thử nghiệm của tôi, và phần lớn các máy của người dùng, nhưng một số người dùng nhận được một sự cố nhất quán của chương trình vào khoảng thời gian khi sự kiện được kích hoạt.Làm cách nào để chạy một cách an toàn mã và sự kiện trong .NET để VB6 có thể xử lý nó?

Tôi nghĩ đây là vấn đề về luồng. Vì vậy, làm thế nào tôi nên xử lý các chủ đề trên bên NET của sự vật? Không có bối cảnh đồng bộ hóa khi mã .NET được gọi và tôi nghĩ rằng đó có thể là vấn đề. Làm thế nào tôi sẽ có được một hoạt động async trở lại thread gọi VB6? VB6 code của tôi là STA và tôi đọc rằng mọi thứ sẽ được marshaled đến thread VB6 thông qua COM tự động, nhưng có lẽ đó là sai? Tôi không hoàn toàn hiểu phải làm gì nếu nó thực sự là một vấn đề luồng.

Tôi chưa thể tìm thấy mẫu máy tính nào gặp sự cố tai nạn và máy tính nào không gặp sự cố.

+2

Có, bạn phải tăng sự kiện trên chuỗi được gọi là hàm tạo của bạn. Bạn cần một SynchronizationContext, bạn có thể dễ dàng có được một từ một hình thức Winforms. Một là đủ, nó không phải được nhìn thấy, chỉ cần đọc thuộc tính xử lý của nó và nó là tốt để đi. –

+1

Hmm làm thế nào tôi sẽ nhận được rằng từ một hình thức VB6? Tôi không mở bất kỳ biểu mẫu nào trong .NET – bzuillsmith

+2

Bạn đã thử tách và so sánh các khuôn khổ .Net trên một máy mục tiêu có thể? mặc dù Microsoft yêu cầu khả năng tương thích ngược hoàn toàn đối với các phiên bản framework .Net gần đây tôi đã tìm thấy nhiều hơn một lần tuyên bố đó về cơ bản là shit ngựa thuần túy. – Stavm

Trả lời

2

Vì vậy, sau này tôi thấy rằng tôi đã bị hiểu sai và không hoạt động trên nhiều máy của người dùng ngoại trừ một vài máy của nhà phát triển. Vấn đề là .tlb tệp không được tạo và đăng ký.

Dường như nếu bạn kích hoạt sự kiện từ chuỗi chính, mọi thứ đều ổn. Nhưng nếu bạn bắn các sự kiện không đồng bộ chỉ có hai cách bạn có thể làm cho nó làm việc mà không bị rơi:

  1. Bạn có thể mang nó trở lại chủ đề chính, có lẽ qua một SynchronizationContext từ một biểu mẫu.
  2. Bạn có thể kích hoạt sự kiện từ bất kỳ chuỗi nào và để nó tự động trở lại luồng STA của VB6, NHƯNG yêu cầu thêm thông tin tlb không có trong sổ đăng ký nếu bạn chỉ đăng ký DLL mà không có tùy chọn tlb. Tùy chọn này là tốt đẹp nếu bạn không đi qua bất kỳ thread UI nào mà thiết lập một SynchronizationContext.

Lưu ý rằng nếu bạn đang sử dụng COM miễn phí, tùy chọn 2 yêu cầu phần tử comInterfaceExternalProxyStub trong tệp kê khai của hội đồng của bạn. Xem question and answer here để biết ví dụ về số

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