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

Eri*_*ick 4 excel .net-4.0 excel-interop

我正在使用VS 2010并致力于将我们的应用程序升级到.NET 4.该应用程序是以Excel为基础构建的,我们希望利用.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.
Run Code Online (Sandbox Code Playgroud)

这是有问题的实际属性:

Dictionary<Excel.Worksheet, IReportSheet> SheetReports { get;}
Run Code Online (Sandbox Code Playgroud)

我们无法在通用对象中使用Interop对象吗?如果是这样,这是.NET 4.0中的严重限制.我尝试将Embed Interop属性设置为false,但这似乎没有改变任何东西.如果有任何解决方法,请告诉我.

小智 9

阿德里安给出了几乎正确的答案,但有一种更好的方法来处理这个错误.不要关闭嵌入互操作类型,而是使用通用接口:

IDictionary<Excel.Worksheet, IReportSheet> SheetReports { get;} 
Run Code Online (Sandbox Code Playgroud)

CLR 4.0引入了类型等价的概念.如果我们稍微简化这意味着那么我们就可以说CLR 4.0处理两个同名的接口类型,具有相同的Guid属性,就好像它们是相同的类型一样.类型等价的注意事项非常深入地构建到系统中,并使得使用等效类型,就好像它是一种类型一样.几个例子; 1.您可以使用反射来调用实现等效接口的对象的接口方法.2. 在等效接口上参数化的通用接口的实例也被认为是等效的.

C#和VB编译器利用此功能实现"嵌入互操作类型"功能.

现在到例外:1.等效接口System.Type的参考比较将失败,因为这些类型系统中仍然是两种不同的类型:

typeOfWorkbookFromAssemblyA.Equals(typeOfWorkbookFromAssemblyB) == false
Run Code Online (Sandbox Code Playgroud)

但是有一个新的API Type.IsEquivalentTo

typeOfWorkbookFromA.IsEquivalentTo(typeOfWorkbookFromB) == true
Run Code Online (Sandbox Code Playgroud)
  1. 在等效接口上参数化的相同泛型类的两个实例不被认为是等效的.

希望这可以帮助.


adr*_*anm 4

VS2010 的一个新功能是将互操作类型嵌入到程序集中,而不是使用外部互操作程序集。

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

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

由于类型“Excel.Worksheet”现在位于程序集内部,因此其他程序集无法使用基于它的通用类型(这就是错误消息所说的内容)

如果你这样做,你会得到类似的错误

internal class X { }
public class Y {
    public List<X> l;
}
Run Code Online (Sandbox Code Playgroud)

我没有使用过 VS2010,但我确信一定有一个选项可以关闭嵌入式互操作类型。