gpt4 book ai didi

excel - 我们是否无法在 .NET 4.0 中的通用对象中使用 Interop 对象?

转载 作者:行者123 更新时间:2023-12-02 09:05:38 25 4
gpt4 key购买 nike

我正在 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,但这似乎没有改变任何内容。如果有任何解决办法,请告诉我。

最佳答案

Adrian 给出了几乎正确的答案,但是有更好的方法来处理这个错误。不要关闭嵌入互操作类型,而是使用通用接口(interface):

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

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

C# 和 VB 编译器利用此功能来实现“嵌入互操作类型”功能。

现在讨论异常(exception)情况:1. 等效接口(interface) System.Type 之间的引用比较将失败,因为它们在类型系统中仍然是两种不同的类型:

typeOfWorkbookFromAssemblyA.Equals(typeOfWorkbookFromAssemblyB) == false

但是有一个新的 API Type.IsEquivalentTo

typeOfWorkbookFromA.IsEquivalentTo(typeOfWorkbookFromB) == true
  1. 在等效接口(interface)上参数化的同一泛型的两个实例不被视为等效。

希望这有帮助。

关于excel - 我们是否无法在 .NET 4.0 中的通用对象中使用 Interop 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com