我正在 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.
这是存在问题的实际属性:
Dictionary<Excel.Worksheet, IReportSheet> SheetReports { get;}
我们是否无法在通用对象中使用 Interop 对象?如果是这样,这就是 .NET 4.0 中的一个严重限制。我尝试将 Embed Interop 属性设置为 false,但这似乎没有改变任何内容。请告诉我是否有任何解决办法。
阿德里安给出了几乎正确的答案,但有更好的方法来处理这个错误。不要关闭嵌入互操作类型,而是使用通用接口:
IDictionary<Excel.Worksheet, IReportSheet> SheetReports { get;}
CLR 4.0 引入了类型等效的概念。如果我们稍微简化一下这意味着什么,那么我们可以说 CLR 4.0 将两个具有相同命名的接口类型(具有相同的 Guid 属性)视为同一类型。请注意,类型等效性非常深入地构建在系统中,并且使得使用等效类型就好像它是一种类型一样。例子很少;
1. 您可以使用反射来调用实现等效接口的对象上的接口方法。
2. 泛型的实例接口在等效接口上参数化也被认为是等效的。
C# 和 VB 编译器利用此功能来实现“嵌入互操作类型”功能。
现在来说说例外情况:
1. 等效接口 System.Type 之间的引用比较将失败,因为它们仍然是类型系统中的两种不同类型:
typeOfWorkbookFromAssemblyA.Equals(typeOfWorkbookFromAssemblyB) == false
但有一个新的 API Type.IsEquivalentTo
typeOfWorkbookFromA.IsEquivalentTo(typeOfWorkbookFromB) == true
- 同一泛型的两个实例class在等效接口上参数化不被认为是等效的。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)