相互運用タイプを埋め込むことはできません


668

C#で.NET 4.0フレームワーク(beta2)にWebアプリケーションを作成しています。

「ActiveHomeScriptLib」というアセンブリを使用しようとすると、次のエラーが発生します。

Interopタイプ「ActiveHomeScriptLib.ActiveHomeClass」を埋め込むことはできません。代わりに適切なインターフェースを使用してください。

フレームワークをバージョン3.5に変更しても、エラーは発生しません。

相互運用タイプとは何ですか?これは、4.0フレームワークを使用した場合にのみ発生するのはなぜですか?


この記事は、相互運用性/ PIAの問題を解決するのに非常に役立ちました。blogs.msdn.com/b/vbteam/archive/2010/06/11/...
GilesDMiddleton

回答:


1069

.NET 4.0では、プライマリ相互運用機能アセンブリ(または、必要なビット)をアセンブリに埋め込むことができるため、アプリケーションと一緒に配置する必要がありません。

何らかの理由で、このアセンブリを埋め込むことはできません-しかし、それはあなたにとって問題ではないようです。Visual Studio 2010でアセンブリの[プロパティ]タブを開き、 "Embed Interop Types"を "False"に設定するだけです。

編集:Michael Gustusの回答も参照してください、Class使用しているタイプからサフィックスを削除してください。


2
残念ながら、これは私が必要としているもののように聞こえますが、このプロパティはもう利用できないようです。
デイブ

130
右クリックではなく、プロジェクトのプロパティページを探していました。参照ペインの影響を受けるDLLのプロパティ。
justSteve

5
エラーが言っているように、「適切なインターフェースを使用する」ようにするほうが理にかなっていると思いませんか?(別のクラスからの)このエラーが発生し、CoClass属性としてそのクラスが指定されているインターフェイスをインスタンス化することができ、機能しました。以下のMichael Gustusの回答のように、BlahClassのインターフェースは単にBlahと呼ばれましたが、これは標準的な規則のようです。
Tim Goodman、

1
埋め込みの優れた点は、Interopアセンブリは実行時に必要ないので、CopyLocal = Falseのままにできることです。
Schmuli

@TimGoodman for me「適用可能なインターフェース」は機能しませんでしembed interop typesfalseが、上記のプロパティを設定してトリックを行いました。私の場合-私はMicrosoft.Office.Interop.Excelライブラリを使用していて、Workbookオブジェクトにアクセスする必要がありました。それのインターフェースを使用することWorkbook(命名規則...)はオプションではありませんでした-私は受け取りましたCOM object、望まれていませんでしたMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

485

ほとんどの場合、このエラーは、COMオブジェクトをインスタンス化しようとするコードの結果です。たとえば、Excelを起動するコードの一部を次に示します。

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

通常、.NET 4では、「クラス」サフィックスを削除してコードをコンパイルするだけです。

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

MSDNの説明はこちらです。


16
+1これは、「該当するインターフェースを使用してください」というエラーメッセージが実際に行うように指示しているものだと思います。Excel.Applicationはインターフェイスです(ここで説明する状況と同様に、新しいキーワードでインスタンス化できるという事実にもかかわらず、stackoverflow.com / questions / 6960910 /
Tim Goodman '19

「Embed Interop Types」から「False」または「True」へ
Kiquenet 2015年

1
@Kiquenetここでのアドバイスに従えば、 'Embed Interop Types'をTrueに戻すことができます。または、少なくとも私にとってはうまくいきました
Sam Holder

122

Janのようにそれを得るのにしばらく時間がかかりました.. = Sそれで、欲求不満で盲目になっている他の誰にとっても。

  • プロジェクトの参照の下にあるソリューションエクスプローラーで追加した問題のあるアセンブリを右クリックします。(私の場合はWIA)
  • プロパティをクリックします。
  • そして、Embed Interop Assemblyのオプションがあるはずです。
  • Falseに設定します

15
私はあなたがしなければならなかった実現までにはまだ苦労してアセンブリ相互運用を右クリックし、[ソリューションエクスプローラのプロジェクト参照の下、NOTアセンブリあなたにしている建物を!
SteveWilkinson、2011

2
さて、(10年後)このオプションは、「埋め込み相互運用型」と呼ばれている
デヴィッド・フォーリー

36

Visual Studio 2012でEmbed Interopを設定する場所は次のとおりです

ここに画像の説明を入力してください


34

ジョンの正解を拡張します。

ここでの問題は、新しい "Embed Interop Types"(またはNoPIA)機能をクラスタイプの使用と組み合わせていることです。「組み込み相互運用機能タイプ」機能は、PIA(プライマリ相互運用機能アセンブリ)からすべてのタイプを参照アセンブリに静的にリンクすることで機能し、展開のオーバーヘッドを取り除きます。

この機能は、PIAのほとんどのタイプに最適ですが、制限があります。それらの1つは、クラスを埋め込むことができないことです(これはサービスの問題です)。ミーシャはなぜこれが許可されないのかについての詳細なブログ記事を持っています


15

解決策を得た

参照に移動して目的のdllを右クリックすると、オプション「Embed Interop Types」から「False」または「True」が表示されます。


1
これは、PP_COM_Wrapperを使用する.netでのVS2015 c#でも機能しました。cypress.comに記載されている Cypress Semiconductor Corporation C#Libの例。Falseに設定すると、エラーが解消されました。
user3564895 2016年

9

TFSプロジェクトをローカルマシンにプルすると、この問題が発生しました。伝えられるところによると、それを書いた男のマシンでは問題なく動いていました。私はこれを単に変更しました...

WshShellClass shellClass = new WshShellClass();

これに...

WshShell shellClass = new WshShell();

今、それはチャンピオンのように働いています!


1
このアプローチは私にとってもうまくいきました!私の場合、デバッグして、必要な値がどこにあるかを見つけ、右クリックして「式をコピー」を選択しました。私に与えられたのは "... HTMLDocumentClass ..."でした。テキストから "Class"を削除すると問題が解決しました。
majestzim 2016

3

VB.NET 2013とOffice 2007で同じ問題があり、これで解決しました。

VS 2013 VB.NETプロジェクト>小道具>参照> Microsoft Word 12.0オブジェクトライブラリ>相互運用型の埋め込み:TrueをFalseに変更


1

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

このエラーは、新しいプロジェクトで参照されるTestStand API InteropアセンブリのEmbed Interop Typesプロパティのデフォルト値がtrueであるために発生します。このエラーを解決するには、次の手順に従って、Embed Interop Typesプロパティの値をFalseに変更します。ソリューションエクスプローラーのプロジェクトの参照セクションでTestStand Interop Assembly参照を選択します。プロパティブラウザーでEmbed Interop Typesプロパティを見つけ、値をFalseに変更します。


1

Visual Studio 2017バージョン15.8では、PackageReferencesyntax使用してVisual Studio Extensibility(VSIX)プロジェクトのNuGetパッケージを参照できるようになりました。これにより、NuGetパッケージを推論するのがはるかに簡単になり、VSSDK全体を含む完全なメタパッケージを入手できるようになります。

以下のNuGetパッケージをインストールすると、EmbedInteropTypesの問題が解決します。

インストールパッケージMicrosoft.VisualStudio.SDK.EmbedInteropTypes

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.