Loại interop không thể được nhúng


666

Tôi đang tạo một ứng dụng web trên khung .NET 4.0 (beta2) trong C #.

Khi tôi cố gắng sử dụng một hội đồng có tên "ActiveHomeScriptLib", tôi gặp lỗi sau:

Loại interop 'ActiveHomeScriptLib.ActiveHomeClass' không thể được nhúng. Sử dụng giao diện áp dụng thay thế.

Khi tôi thay đổi khung thành phiên bản 3.5, tôi không có bất kỳ lỗi nào.

Loại Interop là gì và tại sao điều này chỉ xảy ra khi tôi sử dụng khung 4.0?


Tôi thấy bài viết này rất hữu ích để giải quyết các vấn đề liên quan đến PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/...
GilesDMiddleton

Câu trả lời:


1066

.NET 4.0 cho phép các cụm lắp ghép chính (hay đúng hơn là các bit của nó mà bạn cần) được nhúng vào cụm của bạn để bạn không cần phải triển khai chúng cùng với ứng dụng của mình.

Vì lý do nào, lắp ráp này không thể được nhúng - nhưng có vẻ như đó không phải là vấn đề với bạn. Chỉ cần mở tab Thuộc tính để lắp ráp trong Visual Studio 2010 và đặt "Các loại tương tác nhúng" thành "Sai".

EDIT: Xem thêm câu trả lời của Michael Gustus , loại bỏ Classhậu tố khỏi các loại bạn đang sử dụng.


2
Thật không may, điều này nghe có vẻ giống như những gì tôi cần, nhưng tài sản này dường như không còn nữa.
Dave

130
Tôi đã tìm trong trang thuộc tính của Dự án thay vì nhấp chuột phải | Các thuộc tính trên DLL bị ảnh hưởng trong khung Tham chiếu.
justSteve 16/212

5
Sẽ không có ý nghĩa hơn khi làm như lỗi nói và "sử dụng giao diện áp dụng"? Tôi đã gặp lỗi này (từ một lớp khác) và có thể khởi tạo một giao diện có lớp đó được chỉ định làm thuộc tính CoClass của nó và nó đã hoạt động. Như trong câu trả lời của Michael Gustus bên dưới, giao diện cho BlahClass chỉ được gọi là Blah, dường như là quy ước tiêu chuẩn.
Tim Goodman

1
Một điều tuyệt vời khi nhúng là tập hợp Interop có thể vẫn là CopyLocal = false, vì bạn không cần nó khi chạy.
Schmuli

@Timoodman đối với tôi "giao diện áp dụng" không hoạt động, nhưng thiết lập thuộc tính được đề cập ở trên embed interop typesđể falsethực hiện thủ thuật. Trong trường hợp của tôi - tôi đã làm việc với Microsoft.Office.Interop.Excelthư viện và cần truy cập vào đối tượng Workbook. Sử dụng giao diện của nó Workbook(btw. Quy ước đặt tên ...) không phải là một tùy chọn - Tôi đã nhận được COM object, không phải mong muốnMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

483

Trong hầu hết các trường hợp, lỗi này là kết quả của mã cố gắng khởi tạo một đối tượng COM. Ví dụ: đây là một đoạn mã khởi động Excel:

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

Thông thường, trong .NET 4, bạn chỉ cần xóa hậu tố 'Class' và biên dịch mã:

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

Một lời giải thích MSDN là ở đây .


16
+1 Tôi tin rằng đây là những gì thông báo lỗi thực sự bảo bạn làm khi thông báo "sử dụng giao diện áp dụng". Lưu ý rằng Excel.Application là một giao diện (mặc dù thực tế là nó có thể được khởi tạo với từ khóa mới, tương tự như tình huống được mô tả ở đây: stackoverflow.com/questions/6960910/ .)
Tim Goodman

"Các loại tương tác nhúng" thành "Sai" hoặc "Đúng" ?
Kiquenet

1
@Kiquenet nếu bạn làm theo lời khuyên ở đây, bạn có thể đặt 'Các loại tương tác nhúng' trở lại thành True hoặc ít nhất là nó hoạt động tốt với tôi
Sam Chủ

122

Giống như Jan Tôi phải mất một thời gian để có được nó .. = S Vì vậy, đối với bất kỳ ai khác bị mù với sự thất vọng.

  • Nhấp chuột phải vào hội đồng vi phạm mà bạn đã thêm trong trình khám phá giải pháp trong Tài liệu tham khảo dự án của bạn . (Trong trường hợp của tôi là WIA)
  • Nhấp vào thuộc tính.
  • Và nên có tùy chọn ở đó cho Embed Interop hội.
  • Đặt thành Sai

15
Vẫn đang vật lộn cho đến khi tôi nhận ra rằng bạn phải nhấp chuột phải vào tổ hợp interop trong Dự án Tham khảo trong Solution Explorer, KHÔNG phải là hội thảo bạn đang xây dựng!
SteveWilkinson

2
Bây giờ, (mười năm sau) tùy chọn này được gọi là "Các loại tương tác nhúng"
David Foley

36

Đây là nơi để đặt Interop nhúng trong Visual Studio 2012

nhập mô tả hình ảnh ở đây


34

Mở rộng câu trả lời đúng của Jon.

Vấn đề ở đây là bạn đang kết hợp tính năng "Các loại tương tác nhúng" (hoặc NoPIA) mới với việc sử dụng một loại lớp. Tính năng "Các loại tương tác nhúng" hoạt động bằng cách liên kết tĩnh trong tất cả các loại từ PIA (Hội đồng liên kết chính) vào tổ hợp tham chiếu loại bỏ chi phí triển khai.

Tính năng này hoạt động tuyệt vời cho hầu hết các loại trong PIA nhưng nó có những hạn chế. Một trong số đó là bạn không thể nhúng các lớp (đó là vấn đề phục vụ). Misha có một bài viết blog chi tiết về lý do tại sao điều này không được phép


15

Có giải pháp

Đi đến tham chiếu nhấp chuột phải vào dll mong muốn, bạn sẽ nhận được tùy chọn "Các loại tương tác nhúng" thành "Sai" hoặc "Đúng".


1
Điều này cũng hoạt động cho VS2015 c # với .net bằng PP_COM_Wrapper; được đưa ra trong cypress.com Ví dụ về tập đoàn bán dẫn Cypress C # Lib. Đặt thành Sai đã thoát khỏi lỗi.
dùng3564895

9

Tôi gặp vấn đề này khi kéo một dự án TFS xuống máy cục bộ của tôi. Bị cáo buộc, nó đã hoạt động tốt trên máy của người đã viết nó. Tôi chỉ đơn giản là thay đổi điều này ...

WshShellClass shellClass = new WshShellClass();

Để ...

WshShell shellClass = new WshShell();

Bây giờ, nó đang làm việc như một nhà vô địch!


1
Cách tiếp cận này cũng làm việc cho tôi! Trong trường hợp của tôi, tôi đã gỡ lỗi để tìm giá trị tôi cần ở đâu, nhấp chuột phải và chọn "biểu thức sao chép". Thứ được trao cho tôi là "... HTMLDocumentClass ..." Xóa văn bản "Class" khỏi nó đã giải quyết vấn đề cho tôi.
majestzim

3

Tôi đã gặp vấn đề tương tự trong VB.NET 2013 với Office 2007 và điều này đã giải quyết nó:

Dự án VB.NET VB 2013> Đạo cụ> Tham chiếu> Đối tượng Microsoft Word 12.0 Lib> Các loại tương tác nhúng: thay đổi Đúng thành Sai


1

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

Lỗi này xảy ra do giá trị mặc định là đúng đối với thuộc tính Kiểu tương tác nhúng của cụm Interop API TestStand được tham chiếu trong dự án mới. Để khắc phục lỗi này, hãy thay đổi giá trị của thuộc tính Kiểu nhúng tương tác thành Sai bằng cách thực hiện theo các bước sau: Chọn tham chiếu hội đồng TestStand trong phần tham chiếu của dự án của bạn trong Solution Explorer. Tìm thuộc tính Kiểu tương tác nhúng trong Trình duyệt thuộc tính và thay đổi giá trị thành Sai


1

Visual Studio 2017 phiên bản 15.8 cho phép sử dụng GóiReferencesyntax để tham chiếu các gói NuGet trong các dự án Mở rộng Visual Studio (VSIX). Điều này làm cho nó đơn giản hơn nhiều để lý do về các gói NuGet và mở ra cơ hội để có một gói meta hoàn chỉnh chứa toàn bộ VSSDK.

Cài đặt bên dưới gói NuGet sẽ giải quyết vấn đề EmbedInteropTypes .

Cài đặt gói Microsoft.VisualStudio.SDK.EmbedInteropTypes

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.