簡體   English   中英

從激活的程序集(插件)加載時,System.Windows.Forms.Timer對象不會打勾

[英]System.Windows.Forms.Timer object does not tick when loaded from an activated assembly (plugin)

我目前正在研究一個將程序集(插件)加載到主AppDomain空間中的項目(通過Reflection的Assembly.LoadFile()和Activator類)。 作為帶有插件的API的一部分,托管應用程序可以請求Control派生的對象以在宿主的窗體上顯示。

本質上:“宿主應用程序”是WinForms應用程序,可以加載包含控件的程序集。 托管應用程序(通過Assembly.LoadFile())加載程序集,然后從每個程序集請求控件。 然后將控件呈現在表單上(添加到容器中)。

一切看起來都可以與控件正常工作(按鈕,標簽,圖像等),並且是交互式的。 但是,如果在窗體中使用了計時器(WinForms組件-非System.Threading.Timer),則不會打勾。 如果控件直接在主機中使用(當引用為依賴項時),計時器將按預期計時。

如果有人從程序集中加載WinForms Timer的問題,是否有人無法正確地將其插入消息泵,是否有人知道?

目前尚不清楚“ AppDomain空間”的含義。 猜測:這是一篇出色的博客文章 ,描述了在輔助AppDomain中加載控件的危害。 關鍵部分是這一部分,然后提供有關如何使其工作的建議:

Windows窗體僅支持通過應用程序域隔離頂級窗口。 它不支持跨域的父子關系。 許多人認為,由於Control最終從MarshalByRefObject派生而來,因此可以成功進行遠程控制。 這不是真的。 控件上的某些接口可以跨域遠程訪問,但是控件的API本身不支持遠程處理。 當您看到異常說明該對象由於不可序列化而無法進行遠程處理時,您會看到有人試圖將遠程代理轉換為Control。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM