我们无法在.NET 4.0中的generics对象中使用Interop对象吗?

我正在VS 2010中工作,并将应用程序升级到.NET 4.应用程序是以Excel为基础构build的,我们希望利用.NET的一些改进来使用Excel。 但是我遇到了一个奇怪的错误,似乎是由通用字典中使用Excel Interop对象造成的。 这是生成的错误:

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;} 

我们无法在通用对象中使用Interop对象吗? 如果是这样,这是.NET 4.0中的一个严重的限制。 我试着将Embed Interop属性设置为false,但是这似乎没有改变任何东西。 请让我知道这是否有任何反应。

干杯!

埃里克

VS2010的一个新function是将互操作typesembedded到程序集中,而不是使用外部互操作程序集。

好处是您不需要分发互操作程序集。

缺点是每个程序集都有自己的一组互操作types。

由于types“Excel.Worksheet”现在是您的程序集的内部,其他程序集不能使用基于它的通用types(这是错误消息说)

你会得到类似的错误

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

我没有使用VS2010,但我确定必须有一个选项,您可以closuresembedded的互操作types。

阿德里安给出了几乎正确的答案,但有一个更好的方式来处理这个错误。 不要closuresembedded互操作types,而应使用通用接口:

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

CLR 4.0引入了types对等的概念。 如果我们稍微简化这个意思,那么我们可以说CLR 4.0将两个相同的接口types对待,它们具有相同的Guid属性,就像它是相同的types一样。 注意到types等价性是非常深入地构build到系统中的,并且使得对等types的工作就像是一种types一样。 几个例子; 1.您可以使用reflection来调用实现等效接口的对象的接口方法。 2.在等效接口上参数化的通用接口实例也被认为是等效的。

C#和VB编译器利用此function来实现“embedded互操作types”function。

现在来看例外情况:1.等价接口System.Type之间的引用比较将失败,因为这些在types系统中仍然是两种不同的types:

 typeOfWorkbookFromAssemblyA.Equals(typeOfWorkbookFromAssemblyB) == false 

但是有一个新的API Type.IsEquivalentTo

 typeOfWorkbookFromA.IsEquivalentTo(typeOfWorkbookFromB) == true 
  1. 在等价的接口上参数化的同一generics类的两个实例不被认为是等价的。

希望这可以帮助。

我遇到了与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; }