สร้างตัวควบคุม WPF ที่ทำงานในกระบวนการภายนอก

ฉันมีแอป WPF ซึ่งมีการควบคุมลูกจำนวนหนึ่ง

หนึ่งในการควบคุมเหล่านี้โฮสต์ไลบรารีของบุคคลที่สามซึ่งอยู่ใต้หน้าปกจะรันโค้ดเนทิฟบางตัวซึ่งจะทำให้เกิดการละเมิดการเข้าถึงและทำให้แอปพลิเคชันขัดข้อง ขออภัย การลบไลบรารี่ออกไม่ใช่ทางเลือก

สิ่งที่ฉันต้องการทำคือสร้างกระบวนการ windows ใหม่ โฮสต์ไลบรารีบุคคลที่สามภายในนั้น และสื่อสารกับมันด้วยวิธีใดวิธีหนึ่ง ในลักษณะเดียวกับที่ Google Chrome และ IE8 จัดการปลั๊กอินของเบราว์เซอร์

ปัญหาคือไลบรารีของบุคคลที่สามจำเป็นต้องวาดไปที่หน้าจอ ดังนั้นฉันจึงต้องมี iframe ที่เทียบเท่ากับ HTML ภายในหน้าต่างหลักของแอป WPF ของฉัน

ฉันไม่แน่ใจว่าจะเริ่มต้นอย่างไร มันยากสำหรับ Google จนถึงตอนนี้ คำแนะนำใด ๆ ที่ชื่นชมอย่างมาก


person Orion Edwards    schedule 13.07.2009    source แหล่งที่มา
comment
คุณมาทำอะไรที่นี่? อยากรู้เรื่องนี้มาก   -  person Anderson Imes    schedule 02.10.2009
comment
ยังไม่ได้ทำอะไรเลย จะต้องจำไว้ว่าต้องอัปเดตคำถามนี้เมื่อเราทำ   -  person Orion Edwards    schedule 04.10.2009


คำตอบ (3)


นี่เป็นเรื่องยาก แต่โชคดีสำหรับคุณที่มีงานเล็กๆ น้อยๆ ในพื้นที่นี้เมื่อเร็วๆ นี้

คุณเคยได้ยินเกี่ยวกับเนมสเปซ System.Addin ใน .NET 3.5 หรือไม่? มันอาจช่วยได้ในกรณีนี้ อนุญาตให้โหลดการควบคุมใน AppDomain แยกต่างหาก แต่แสดงใน UI เดียวกัน ฉันคิดว่าคุณจะต้องทำงานสักหน่อยเพื่อให้ทุกอย่างสื่อสารได้อย่างถูกต้อง (ไม่เคยทำสิ่งนี้มาก่อน) แต่ก็เป็นไปได้

ดูโพสต์ก่อนหน้านี้จากทีมงาน Add-in: http://blogs.msdn.com/clraddins/archive/2007/08/06/appdomain-ulated-wpf-add-ins-jesse-kaplan.aspx

ดูเหมือนว่าพวกเขาจะเก็บตัวอย่างและโค้ดตัวช่วยไว้ใน codeplex: http://clraddins.codeplex.com/

ฉันสนใจเรื่องนี้มาก ดังนั้นหากคุณได้ผล โปรดแจ้งให้เราทราบว่าสิ่งนี้เป็นอย่างไร!

person Anderson Imes    schedule 13.07.2009
comment
ขอบคุณ. ฉันเคยตรวจสอบ System.Addins มาก่อนและดูเหมือนว่าจะใช้งานได้ ฉันจะดาวน์โหลดตัวอย่าง clr-addins และดู หวังว่าฉันจะสามารถเข้าใจเทคนิคพื้นฐานที่พวกเขาใช้และใช้งานด้วยตัวเอง - เนื้อหาสัญญาที่ System.Addins ต้องการนั้นมีน้ำหนักมากกว่าที่ฉันต้องการหรือต้องการมาก - person Orion Edwards; 14.07.2009
comment
วิธีที่ฉันได้อ่านพวกเขากำลังทำอะไรมากมายหรือคุณอยู่ที่นั่น ลองดูที่ตัวสร้างไปป์ไลน์... หวังว่านั่นจะช่วยให้คุณเริ่มต้นได้และอาจเพิกเฉยต่อสัญญาหลายๆ อย่างได้ พวกเขากำลังทำเวทมนตร์สุดบ้าระห่ำอยู่ที่นั่น ฉันอาจอ่านผิด แต่ดูเหมือนว่าพวกเขาจะได้รับการสนับสนุนอยู่นอกกระบวนการ... ซึ่งคงเป็นเรื่องยากมากที่จะนำไปใช้ - person Anderson Imes; 14.07.2009

มาช้าไป. หากคุณยังคงต้องการสิ่งนี้ คุณเคยเห็นโปรเจ็กต์นี้แล้ว: https://docs.microsoft.com/en-us/archive/blogs/changov/hosting-wpf-ui-cross-thread-and-cross-process

ฉันใช้ปลั๊กอินหลายตัวในกระบวนการภายนอกหลายกระบวนการในแอป LOB ของฉัน กรอบงานของฉันเติบโตจากโครงการด้านบน

person Scott J    schedule 03.02.2011

อาจไม่ใช่งานที่ง่ายที่สุด คุณเคยพิจารณาที่จะโฮสต์เนื้อหาของบุคคลที่สามของคุณใน App-Domain ที่แยกจากกันหรือไม่? ด้วยวิธีนี้ คุณจะได้รับการแยกตัวในระดับที่ดี ในขณะเดียวกันก็ช่วยให้คุณไม่ต้องยุ่งยากกับโปรเจ็กต์อื่นอีกด้วย จำเป็นต้องรีเฟรชอย่างต่อเนื่องหรือคุณสามารถรีเฟรชตามจุดที่กำหนดไว้ล่วงหน้าในแอปพลิเคชันของคุณได้หรือไม่? บางทีรูปแบบบางอย่างที่คุณจับภาพหน้าจอของเอาต์พุตของบุคคลที่สามและแสดงเป็นรูปภาพในแอปดั้งเดิมของคุณอาจเป็นไปได้...

person flq    schedule 13.07.2009
comment
ตามที่ฉันเข้าใจ AppDomain ที่แยกจากกันยังคงอยู่ในกระบวนการ win32 เดียวกันหรือไม่ ฉันต้องเรียกใช้มันในกระบวนการ windows ที่แยกจากกันเนื่องจากแอปพลิเคชันบุคคลที่สามหยุดทำงานที่ระดับโค้ดเนทิฟ (การละเมิดการเข้าถึง win32 และอื่น ๆ ) เมื่อสิ่งเหล่านี้เกิดขึ้น กระบวนการ Windows ทั้งหมดจะหยุดทำงาน .NET และทั้งหมด - person Orion Edwards; 14.07.2009
comment
AppDomain ควรทำเคล็ดลับให้คุณ - หาก AppDomain ตัวหนึ่งหยุดทำงาน ตัวอื่นๆ ก็ไม่เป็นไร คิดว่า AppDomain เป็นกระบวนการ .NET (ประมาณนั้น) - person Andy; 14.07.2009
comment
คุณจะต้องนำการควบคุมข้ามขอบเขตเพื่อให้สิ่งนี้ทำงานได้ และการควบคุมจะไม่ขยาย MarshallByRefObject ดังนั้นสิ่งนี้จะไม่ทำงาน - person ; 20.07.2009
comment
ถ้ามันไม่ทำงาน System.Addin ใน BCL จะทำอย่างไร? มีการสาธิตการควบคุมผู้ใช้ WPF ที่ไม่อยู่ในกระบวนการ - person Orion Edwards; 04.10.2009
comment
เพื่อชี้แจงให้ชัดเจน - AppDomains ให้เฉพาะการแยกหน่วยความจำเท่านั้น พวกเขาไม่ได้ปกป้องแอปพลิเคชันในระดับการดำเนินการ ซึ่งหมายความว่าหาก AppDomain ใด ๆ ภายในกระบวนการประสบปัญหา Unhandled Exception กระบวนการทั้งหมดจะหยุดทำงาน วิธีเดียวที่จะปกป้องแอปพลิเคชันโฮสติ้งได้คือต้องแน่ใจว่าโค้ดที่ไม่ปลอดภัยถูกแยกออกจากกระบวนการแยกต่างหาก - person Adam; 06.09.2010