ไม่สามารถฝังประเภทการทำงานร่วมกันได้


668

ฉันกำลังสร้างเว็บแอปพลิเคชันบน. NET 4.0 framework (beta2) ใน C #

เมื่อฉันพยายามใช้แอสเซมบลีชื่อ "ActiveHomeScriptLib" ฉันได้รับข้อผิดพลาดต่อไปนี้:

ไม่สามารถฝังประเภท Interop 'ActiveHomeScriptLib.ActiveHomeClass' ได้ ใช้อินเทอร์เฟซที่เกี่ยวข้องแทน

เมื่อฉันเปลี่ยนกรอบงานเป็นเวอร์ชัน 3.5 ฉันไม่มีข้อผิดพลาดใด ๆ

ประเภท Interop คืออะไรและทำไมสิ่งนี้เกิดขึ้นเฉพาะเมื่อฉันใช้กรอบงาน 4.0 เท่านั้น


ฉันพบบทความนี้มีประโยชน์มากสำหรับการแก้ไขปัญหา interop / PIA blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

คำตอบ:


1069

.NET 4.0 อนุญาตให้แอสเซมบลี interop หลัก (หรือค่อนข้างบิตของที่คุณต้องการ) ที่จะฝังลงในแอสเซมบลีของคุณเพื่อให้คุณไม่จำเป็นต้องปรับใช้พวกเขาพร้อมกับใบสมัครของคุณ

ไม่ว่าจะด้วยเหตุผลใดก็ตามแอสเซมบลีนี้ไม่สามารถฝังตัวได้ แต่ดูเหมือนว่าไม่ใช่ปัญหาสำหรับคุณ เพียงเปิดแท็บคุณสมบัติสำหรับแอสเซมบลีใน Visual Studio 2010 และตั้ง "ประเภท Interop ฝัง" เป็น "เท็จ"

แก้ไข: ดูคำตอบของ Michael Gustus โดยลบClassคำต่อท้ายจากประเภทที่คุณใช้


2
น่าเสียดายที่ฟังดูเหมือนสิ่งที่ฉันต้องการ แต่คุณสมบัตินี้ดูเหมือนจะไม่สามารถใช้ได้อีกต่อไป
เดฟ

130
ฉันดูในหน้าคุณสมบัติของโครงการแทนการคลิกขวา | คุณสมบัติบน DLL ที่ได้รับผลกระทบในบานหน้าต่างการอ้างอิง
justSteve

5
มันจะไม่มีเหตุผลที่จะทำตามที่ระบุไว้และ "ใช้อินเทอร์เฟซที่เกี่ยวข้อง" ฉันมีข้อผิดพลาดนี้ (จากคลาสอื่น) และสามารถอินสแตนซ์ของอินเทอร์เฟซที่มีคลาสนั้นระบุเป็นแอตทริบิวต์ CoClass ของมันและทำงานได้ เช่นเดียวกับคำตอบของ Michael Gustus ด้านล่างอินเทอร์เฟซสำหรับ BlahClass นั้นเรียกว่า Blah ซึ่งดูเหมือนจะเป็นแบบแผนมาตรฐาน
ทิมกู๊ดแมน

1
สิ่งที่ดีเกี่ยวกับการฝังคือแอสเซมบลี Interop สามารถยังคงอยู่ CopyLocal = False เนื่องจากคุณไม่จำเป็นต้องใช้ในขณะรันไทม์
Schmuli

@TimGoodman สำหรับฉัน "ส่วนต่อประสานที่ใช้งานได้" ไม่ทำงาน แต่การตั้งค่าดังกล่าวข้างต้นembed interop typesให้คุณสมบัติเพื่อfalseทำการหลอกลวง ในกรณีของฉัน - ฉันทำงานกับMicrosoft.Office.Interop.Excelห้องสมุดและจำเป็นต้องเข้าถึงวัตถุสมุดงาน การใช้ส่วนต่อประสานWorkbook(btw. แผนการตั้งชื่อ ... ) ไม่ใช่ตัวเลือก - ฉันได้รับCOM objectไม่ใช่ที่ต้องการMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

484

ในกรณีส่วนใหญ่ข้อผิดพลาดนี้เป็นผลมาจากรหัสซึ่งพยายามที่จะยกตัวอย่างวัตถุ COM ตัวอย่างเช่นนี่คือส่วนหนึ่งของรหัสเริ่มต้น Excel:

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();

โดยทั่วไปแล้วใน. NET 4 คุณเพียงแค่ต้องการลบคำต่อท้าย 'Class' และรวบรวมรหัส:

Excel.Application xlapp = new Excel.Application();

คำอธิบายของ MSDN เป็นที่นี่


16
+1 ฉันเชื่อว่านี่เป็นข้อผิดพลาดที่บอกให้คุณทำเมื่อมีข้อความระบุว่า "ใช้อินเทอร์เฟซที่ใช้งานได้" โปรดทราบว่า Excel.Application เป็นอินเทอร์เฟซ (แม้จะมีความจริงที่ว่ามันสามารถอินสแตนซ์กับคำหลักใหม่คล้ายกับสถานการณ์ที่อธิบายไว้ที่นี่: stackoverflow.com/questions/6960910/… )
ทิมกู๊ดแมน

"ฝัง Interop Types"เป็น"False"หรือ"True"หรือไม่
Kiquenet

1
@Kiquenet หากคุณทำตามคำแนะนำที่นี่คุณสามารถตั้งค่า 'ประเภทการฝัง Interop' กลับไปเป็นจริงหรืออย่างน้อยก็ใช้ได้สำหรับฉัน
Sam Holder

122

เช่นเดียวกับแจนฉันใช้เวลาสักครู่เพื่อให้ได้ .. = S ดังนั้นสำหรับคนอื่นที่ตาบอดด้วยความขุ่นมัว

  • คลิกขวาที่กระทำผิดกฎหมายการชุมนุมที่คุณเพิ่มในการสำรวจวิธีการแก้ปัญหาที่อยู่ภายใต้โครงการของคุณอ้างอิง (ในกรณีของฉัน WIA)
  • คลิกคุณสมบัติ
  • และควรมีตัวเลือกสำหรับEmbed Interop Assembly
  • ตั้งเป็นเท็จ

15
ยังคงดิ้นรนจนกระทั่งฉันรู้ว่าคุณต้องคลิกขวาที่แอสเซมบลี interopภายใต้โครงการอ้างอิงในโซลูชัน Explorer ไม่ใช่แอสเซมบลีที่คุณกำลังสร้าง
SteveWilkinson

2
ตอนนี้ (สิบปีต่อมา) ตัวเลือกนี้เรียกว่า "Embed Interop Types"
David Foley


34

ขยายคำตอบที่ถูกต้องของจอน

ปัญหาที่เกิดขึ้นคือคุณกำลังรวมคุณลักษณะ "ประเภทการฝัง Interop" ใหม่ (หรือ NoPIA) เข้ากับการใช้ประเภทคลาส คุณลักษณะ "ประเภท Interop Intered" ทำงานโดยการเชื่อมโยงในทุกประเภทจาก PIA (Primary Interop Assembly) ไปยังชุดประกอบการอ้างอิงเพื่อลบค่าใช้จ่ายในการปรับใช้

คุณลักษณะนี้ใช้งานได้ดีสำหรับประเภทส่วนใหญ่ใน PIA แต่มีข้อ จำกัด หนึ่งในนั้นคือคุณไม่สามารถฝังคลาสได้ (เป็นปัญหาการให้บริการ) Misha มีบทความบล็อกโดยละเอียดเกี่ยวกับสาเหตุที่ไม่อนุญาต


15

เตรียมพร้อมแก้ปัญหา

ไปที่การอ้างอิงคลิกขวาที่ dll ที่ต้องการคุณจะได้รับตัวเลือก "Embed Interop Types" เป็น "False" หรือ "True"


1
สิ่งนี้ยังทำงานกับ VS2015 c # ด้วย. net โดยใช้ PP_COM_Wrapper รับในcypress.com ตัวอย่าง Cypress Semiconductor Corporation C # Lib การตั้งค่าเป็นเท็จได้กำจัดข้อผิดพลาด
user3564895

9

ฉันพบปัญหานี้เมื่อดึงโครงการ TFS ลงในเครื่องท้องถิ่นของฉัน ถูกกล่าวหาว่าใช้งานได้ดีกับเครื่องของคนที่เขียนมัน ฉันแค่เปลี่ยนสิ่งนี้ ...

WshShellClass shellClass = new WshShellClass();

สำหรับสิ่งนี้...

WshShell shellClass = new WshShell();

ตอนนี้มันทำงานเหมือนแชมป์!


1
วิธีนี้ใช้ได้ผลสำหรับฉันเช่นกัน! ในกรณีของฉันฉันกำลังดีบั๊กเพื่อค้นหาตำแหน่งที่ฉันต้องการคือคลิกขวาและเลือก "คัดลอกนิพจน์" สิ่งที่มอบให้ฉันคือ "... HTMLDocumentClass ... " การลบข้อความ "คลาส" ออกจากนั้นจะแก้ไขปัญหาให้ฉันได้
majestzim

3

ฉันมีปัญหาเดียวกันใน VB.NET 2013 กับ Office 2007 และสิ่งนี้แก้ไขได้:

VS 2013 VB.NET โครงการ> อุปกรณ์ประกอบฉาก> ผู้อ้างอิง> Microsoft Word 12.0 Object Lib> ประเภท Interop แบบฝัง: เปลี่ยน True เป็น False


1

http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D0071F307

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากค่าเริ่มต้นเป็นจริงสำหรับคุณสมบัติชนิด Interop Intered ของแอสเซมบลี TestStand API Interop อ้างอิงในโครงการใหม่ เมื่อต้องการแก้ไขข้อผิดพลาดนี้ให้เปลี่ยนค่าของคุณสมบัติ Embed Interop Types เป็น False โดยทำตามขั้นตอนเหล่านี้: เลือกการอ้างอิง TestStand Interop Assembly ในส่วนการอ้างอิงของโครงการของคุณใน Explorer โซลูชัน ค้นหาคุณสมบัติ Embed Interop Types ใน Property Browser และเปลี่ยนค่าเป็น False


1

Visual Studio 2017 รุ่น 15.8 ทำให้สามารถใช้ PackageReferencesyntaxเพื่ออ้างอิงแพ็คเกจ NuGet ในโครงการ Visual Studio Extensibility (VSIX) สิ่งนี้ทำให้เหตุผลของแพคเกจ NuGet ง่ายขึ้นและเปิดประตูสำหรับการใช้เมตาแพ็คเกจที่สมบูรณ์ซึ่งมี VSSDK ทั้งหมด

การติดตั้งแพคเกจดังต่อ NuGet จะแก้EmbedInteropTypesฉบับ

ติดตั้งแพ็คเกจ Microsoft.VisualStudio.SDK.EmbedInteropTypes

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.