5

私はVS2010で作業しており、アプリケーションを.NET 4にアップグレードする作業を行っています。アプリケーションはExcelをベースとして構築されており、Excelを使用するために.NETのいくつかの改善点を利用したいと考えています。しかし、一般的な辞書でExcelInteropオブジェクトを使用したことが原因と思われる奇妙なエラーに遭遇しました。生成されたエラーは次のとおりです。

C:\MyApp\TheAssembly\MyClass.cs(823,57): 
error CS1769: Type 'MyApp\OtherAssemply.IMyController.SheetReports' from assembly 'c:\MyApp\OtherAssemply.\bin\Debug\OtherAssembly.dll' 
 cannot be used across assembly boundaries because it has a generic type 
 parameter that is an embedded interop type.

問題のある実際のプロパティは次のとおりです。

Dictionary<Excel.Worksheet, IReportSheet> SheetReports { get;}

ジェネリックオブジェクトで相互運用オブジェクトを使用できませんか?その場合、これは.NET4.0の重大な制限です。Embed Interopプロパティをfalseに設定しようとしましたが、何も変わらないようです。これを回避する方法があれば教えてください。

4

3 に答える 3

11

Adrian はほぼ正しい答えを出しましたが、このエラーを処理するより良い方法があります。Embed Interop Types をオフにしないで、代わりに汎用インターフェイスを使用します。

IDictionary<Excel.Worksheet, IReportSheet> SheetReports { get;} 

CLR 4.0 では、型等価性の概念が導入されました。これが意味することを少し単純化すると、CLR 4.0 は、同じ Guid 属性を持つ 2 つの同じ名前のインターフェイス型を、同じ型であるかのように扱うと言えます。型の等価性がシステムに非常に深く組み込まれており、同等の型を 1 つの型であるかのように操作できることに注意してください。例はほとんどありません。1. リフレクションを使用して、同等のインターフェイスを実装するオブジェクトでインターフェイス メソッドを呼び出すことができます。2. 同等のインターフェースでパラメーター化されたジェネリックインターフェースのインスタンスも、同等であると見なされます。

C# および VB コンパイラは、この機能を利用して「Embed Interop Types」機能を実装します。

ここで例外があります: 1. 同等のインターフェース System.Type 間の参照比較は失敗します。これは、これらが型システムの 2 つの異なる型であるためです。

typeOfWorkbookFromAssemblyA.Equals(typeOfWorkbookFromAssemblyB) == false

しかし、新しい API Type.IsEquivalentTo があります

typeOfWorkbookFromA.IsEquivalentTo(typeOfWorkbookFromB) == true
  1. 同等のインターフェイスでパラメーター化された同じジェネリッククラスの 2 つのインスタンスは、同等とは見なされません。

お役に立てれば。

于 2012-02-16T08:46:14.277 に答える
4

VS2010 の新機能は、外部相互運用アセンブリを使用する代わりに相互運用型をアセンブリに埋め込むことです。

利点は、相互運用アセンブリを配布する必要がないことです。

欠点は、各アセンブリが相互運用型の独自のセットを取得することです。

型 "Excel.Worksheet" はアセンブリの内部にあるため、他のアセンブリはそれに基づくジェネリック型を使用できません (これはエラー メッセージの内容です)。

実行すると、同様のエラーが発生します

internal class X { }
public class Y {
    public List<X> l;
}

私はVS2010を使用していませんが、組み込みの相互運用タイプをオフにできるオプションがどこかにあるはずです。

于 2009-12-01T14:14:54.287 に答える
2

Outlook AddIn で同様の問題が発生しましたが、Misha が提供する回答は魅力的です。物件を持っていた

public List<Microsoft.Office.Interop.Outlook.Attachment> Attachments { get; set; }

Listインターフェイスへの簡単な変更でIList問題が解決しました

public IList<Microsoft.Office.Interop.Outlook.Attachment> Attachments { get; set; }
于 2015-09-08T09:20:56.760 に答える