พิจารณาว่าจำเป็นต้องใช้ชุดประกอบแอปพลิเคชันใด

มี 2 ​​โครงการ. ทั้งสองเป็นแอปพลิเคชัน WPF ข้อผิดพลาดของแอปพลิเคชัน

แอปพลิเคชัน 1: เพียงให้บริการการสื่อสารภายในกับ ฮาร์ดแวร์ ภายนอก ด้วยเหตุนี้จึงมีคลาสที่ใช้ร่วมกันแบบสาธารณะในคลาสรูทของแอปพลิเคชัน:

Public Shared Log As New clsLog
Public Shared NavigationObjectContainer As New Dictionary(Of String, Object)

โปรเจ็กต์ที่สอง ส่วนใหญ่เป็น GUI และยังใช้คลาสสาธารณะบางส่วนในคลาสรูทของแอปพลิเคชัน:

Public Shared Nav As New clsNavigationHelper

ตอนนี้ โครงการที่สอง (GUI) ใช้การอ้างอิงถึงโครงการ 1 (ฮาร์ดแวร์) และแสดงข้อผิดพลาดต่อไปนี้:

Der Typeninitialisierer สำหรับ "TB_HyperTerminal.Application" ได้ทำ Ausnahme เรียบร้อยแล้ว เป็นภาษาเยอรมัน แต่หมายความว่า Application object ใน Class 1 (Hardware) ไม่สามารถค้นหาคลาสที่แชร์ทั้งหมดได้ (เช่น clsLog และ NavigationObjectContainer)

InnerException

{"วัตถุประสงค์ของประเภท "FSCANT3.Application" อยู่ในประเภท "TB_HyperTerminal.Application" umgewandelt werden"}

คำถามของฉันคือวิธีแก้ปัญหานี้เพื่อให้ได้ แอสเซมบลีที่ถูกต้อง และออบเจ็กต์ Application ที่ถูกต้องสำหรับแต่ละโครงการ

เมื่อค้นหาสาเหตุ ฉันได้เปลี่ยนชื่อคลาสของโปรเจ็กต์ 2 (ฮาร์ดแวร์) เป็น TBHApplication และโปรเจ็กต์ 1 ยังคงเรียกว่า Application ไม่ เราไม่สามารถเห็นได้ว่าทำไมการแคสต์จึงเป็นไปไม่ได้: Application casting


person Nasenbaer    schedule 20.09.2012    source แหล่งที่มา
comment
ข้อความข้อยกเว้นเป็นจริงตัวเริ่มต้นประเภทสำหรับ 'TB_HyperTerminal.Application' ทำให้เกิดข้อยกเว้น ซึ่งหมายความว่าตัวสร้างแบบคงที่สำหรับ TB_HyperTerminal.Application ล้มเหลว คุณควรตรวจสอบข้อยกเว้นภายในเพื่อดูรายละเอียด   -  person Yiğit Yener    schedule 20.09.2012
comment
เพิ่มข้อยกเว้นภายในแล้ว หวังว่าจะช่วยได้มากกว่านี้ในการค้นหาวิธีแก้ปัญหา   -  person Nasenbaer    schedule 20.09.2012
comment
FSCANT3.Application และ TB_HyperTerminal.Application เป็นประเภทที่แตกต่างกันซึ่งไม่สามารถแปลงซึ่งกันและกันได้ แอปพลิเคชันของคุณพยายามแปลงอินสแตนซ์ FSCANT3.Application ไปเป็นอินสแตนซ์ TB_HyperTerminal.Application และนั่นอาจเป็นตัวสร้างแบบคงที่ (Shared Sub New()) ของ TB_HyperTerminal.Application หากคุณสามารถโพสต์รหัสได้มันจะช่วยคิดออก   -  person Yiğit Yener    schedule 20.09.2012
comment
คุณมีประเภทชื่อ Application มากเกินไป รวมถึงอันหนึ่งที่ WPF ใช้ เลือกชื่ออื่น   -  person Hans Passant    schedule 20.09.2012
comment
แอปพลิเคชันถูกตั้งค่าเป็นค่าเริ่มต้นโดย WPF Visual Studio หรือฉันเข้าใจผิดว่าจะเปลี่ยนชื่อ Application อย่างไร   -  person Nasenbaer    schedule 20.09.2012


คำตอบ (1)


มีแอสเซมบลีที่ขึ้นต่อกันของ Application 1 ที่คุณไม่ได้คัดลอกไปยังไดเร็กทอรีเอาต์พุตของโปรเจ็กต์ที่สองหรือไม่

อัปเดตหลังจากพูดคุยในความคิดเห็นด้านล่าง

ตามที่ฉันเข้าใจปัญหาของคุณ คุณต้องการให้ app1 สามารถใช้วิธีการจาก app2 ได้ ในการดำเนินการนี้ คุณต้องมีอินเทอร์เฟซทั่วไประหว่าง 2 แอปพลิเคชันของคุณ สร้างโปรเจ็กต์ที่ 3 (ประเภท 'คลาสไลบรารี') ที่มีเช่น อินเทอร์เฟซที่กำหนดวิธีการทั้งหมดที่จำเป็นสำหรับแอป 1 และใช้งานโดยแอป 2 ทั้ง app1 และ app2 จะอ้างอิง DLL ใหม่นี้ คุณสามารถใช้อินเทอร์เฟซนี้ในวัตถุแอปพลิเคชัน app2 ของคุณ จากนั้น app1 ก็สามารถส่งวัตถุแอปพลิเคชันปัจจุบันไปยังประเภทอินเทอร์เฟซนี้และเรียกใช้เมธอดได้ ฉันไม่แน่ใจว่าฉันเข้าใจว่า app1 สามารถทำงานในโหมดสแตนด์อโลนได้อย่างไร (จำเป็นหรือไม่ ถ้าไม่ app1 ไม่ควรเป็นไลบรารีของชั้นเรียนด้วย)

โปรดทราบว่าการใช้คลาสแอปพลิเคชันสำหรับการสื่อสารนี้ค่อนข้างแปลก วิธีปกติคือการใช้คอนเทนเนอร์ IoC หรือเพียงแค่คุณสมบัติใน app1 โดยที่ app2 สามารถตั้งค่าการใช้งานอินเทอร์เฟซได้

person Timores    schedule 20.09.2012
comment
ไม่ การประกอบไม่ใช่ปัญหา ทั้งหมดอยู่ที่นั่น เพียงเนมสเปซของ Application จะเหมือนกันในโปรเจ็กต์ 1 เช่นเดียวกับในโปรเจ็กต์ 2 นั่นคือโดยค่าเริ่มต้นในโปรเจ็กต์ WPF แต่ฉันไม่รู้ว่าจะแก้ปัญหาอย่างไร - person Nasenbaer; 20.09.2012
comment
ชื่อเต็มของประเภทประกอบด้วยเนมสเปซและแอสเซมบลีที่กำหนดไว้ ดังนั้นฉันไม่คิดว่าคุณจะมีปัญหากับคลาสของแอปพลิเคชัน Static Constructor ทำอะไรและต้องการอะไร? - person Timores; 20.09.2012
comment
ฉันจะเพิ่มภาพหน้าจอ.... ใน VB.Net (คล้ายกับ C#) จะใช้ Global.System.Windows.Application.Current เพื่อส่งไปยังคลาส Application - person Nasenbaer; 20.09.2012
comment
หากคุณทำเช่นนี้ใน Application1 มันจะไม่ทำงาน เนื่องจากจะส่งคืนออบเจ็กต์แอปพลิเคชันของโปรเจ็กต์ 2 (ไม่ว่าชื่ออะไรก็ตาม) - person Timores; 20.09.2012
comment
ฉันรู้ว่ามันไม่ทำงาน แต่จะทำให้มันทำงานได้อย่างไร? เนื่องจากแอปพลิเคชันเนมสเปซนั้นมอบให้โดย DotNet ไม่ใช่โดยตัวฉันเอง - person Nasenbaer; 20.09.2012
comment
ฉันมีมากเกินไปที่จะเขียนในความคิดเห็น โปรดดูคำตอบที่อัปเดต - person Timores; 21.09.2012