web-dev-qa-db-ja.com

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

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

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

相互運用型 'ActiveHomeScriptLib.ActiveHomeClass'は埋め込めません。代わりに適切なインターフェースを使用してください。

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

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

627
Jan

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

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

編集:あなたが使っている型からClass接尾辞を削除して、Michael Gustusの answer も見てください。

1004
Jon Skeet

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

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

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

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

MSDNの説明は ここ です。

455
Michael Gustus

Janのようにそれはそれを得るために私に時間がかかりました.. = Sだからフラストレーションで目がくらんでいる人のために。

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

Jonの正解を拡大します。

ここでの問題は、あなたが新しい "組み込み相互運用機能タイプ"(またはNoPIA)機能をクラスタイプの使用と組み合わせているということです。 「相互運用型の埋め込み」機能は、基本的にすべての型をPIA(プライマリ相互運用機能アセンブリ)から参照元アセンブリに静的にリンクして、展開のオーバーヘッドをなくすことによって機能します。

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

32
JaredPar

これは、Visual Studio 2012で埋め込み相互運用機能を設定する場所です。

enter image description here

28
VK_217

解決策を得た

参照に移動し、あなたが "偽"または "真"にオプション "埋め込み相互運用機能の種類"を得るでしょう希望のdllを右クリック。

12
Navdeep

私はこの問題に遭遇し、TFSプロジェクトを自分のローカルマシンにダウンロードしました。伝えられるところでは、それはそれを書いた男のマシン上でうまく働いていました。私は単にこれを変更しました...

WshShellClass shellClass = new WshShellClass();

これに….

WshShell shellClass = new WshShell();

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

9
Zach

私はOffice 2007とVB.NET 2013で同じ問題を抱えていた、そしてこれはそれを解決した:

VS 2013 VB.NETプロジェクト>小道具> Refs> Microsoft Word 12.0 Object Lib> Interopタイプの埋め込み:TrueをFalseに変更

2
Doug Null

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

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

1
Ramezani r

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

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

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

0
Rahul