为什么 ArrayList 可与 COM Interop 配合使用,而 IList 却不能?

2024-03-13

我注意到,如果我创建一个公开 ArrayList 的 .NET 组件,那么该 ArrayList 将通过 COM Interop 并可在脚本语言(如 VBScript)中使用。

泛型,例如IList<T>似乎不起作用。

这是为什么?有什么方法可以使泛型类型成功地通过 COM Interop 流向脚本引擎吗?


泛型是在 .NET 2.0 中添加的,COM 在 .NET 1.0 之前就已经存在。
(.NET 技术aimed取代。)

COM 从来没有泛型,因此您不能公开它们。
两种 COM 语言(C++、VB6、Delphi)都没有泛型,因此您不能指望它们会被使用。
(嗯,C++ 有模板,但它们是完全不同的野兽,而 COM 仅意味着接口.)

将集合公开为ArrayList is the solution https://stackoverflow.com/questions/269581/what-are-alternatives-to-generic-collections-for-com-interop对于这个问题,你无法解决它。

免责声明:我不是 COM 方面的专家,所以其余的答案大致基于我的猜测。

COM 从未“拥有”ArrayLists,确实如此,但它从未有过any.NET Framework 中的类,因为它本身不是框架。但是,某些 .NET 类型会进入导出的类型库,而有些则不会。 .NET Framework 类怎么样?出色地,ArrayList is [ComVisible], and List<T>不是。

Why?

COM 通过接口工作 http://en.wikipedia.org/wiki/Component_Object_Model#Interfaces,并且接口定义语言对泛型一无所知,也不支持它们。支持 COM 的语言(例如 VB6 或 C++)不知道如何处理泛型。

如果有一种方法可以生成一个接口List<T>, 它会not包含T因此尝试公开泛型类型基本上没有意义。可能的想象替代方案是:

  • 为通用类型生成“特定”版本的接口,例如IListOfString for List<string>
  • 删除泛型类型信息(很像 Java 在编译时所做的那样)并替换T with object.

第一种选择不可行,因为具体T编译时可能不知道类型(阅读:反射),并且List<T>没有[ComVisible]无论如何属性。

第二种选择实际上是可能的,因为你可以提供您自己的类接口IList and ICollection特性 http://www.west-wind.com/weblog/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix#192110:

[ComVisible(true)]
public interface IPerson
{
    string Name { get;set;}
    DateTime Entered { get;set;}
    IList NickNamesList { get;}
    ICollection NickNamesCollection { get;}
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComDefaultInterface(typeof(IPerson))]
public class Person:IPerson
{
    [ComVisible(false)]
    public List<string> NickNames
    {
        get { return _NickNames; }
        set { _NickNames = value; }
    }
    private List<string> _NickNames = new List<string>();

    #region IPerson Members
    IList IPerson.NickNamesList
    {
        get { return this.NickNames; }
    }

    ICollection IPerson.NickNamesCollection
    {
        get { return this.NickNames; }
    }
    #endregion
    ....
}

这是一种解决方法,但不能回答您的问题。

我实际上想知道你是否可以得出你的StringList班级来自List<string>并将其标记为[ComVisible(true)]。您可能想检查一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ArrayList 可与 COM Interop 配合使用,而 IList 却不能? 的相关文章

  • 在基本静态构造函数中显式调用静态构造函数

    这有点奇怪 复杂 更多的是出于好奇 我正在寻找一种方法来确保来自基类的静态调用可以安全地使用派生类中设置的静态信息 然后我注意到 C 允许我在基类静态构造函数中调用派生类静态构造函数 我的问题 在基类静态构造函数中调用派生类静态构造函数是否
  • 如何在 AOT 平台上运行时生成任何泛型类型?

    我需要在 AOT 平台上运行时生成泛型类型 我知道一种 解决方法 它提示编译器通过在代码中创建虚拟方法来生成特定的泛型类 public void DoDummy var a1 new MyClass
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 将元组划分为多个元组的类型安全方法

    我们有一个特征 除其他外 还包含execute T lt Record Seq Session gt T Seq T 方法 其中Record是我们从数据库中检索的所有特征的超级特征 trait DbTrait val threadCount
  • Jmeter动态生成请求的json负载

    我有一个 Jmeter 测试计划 我希望 HttpSampler 发送发布请求 请求正文应包含 Json 如下所示 productIds p1 p2 我设置了一个随机变量生成器 每次调用都会返回格式正确的 ProductId 我想做的是通过
  • 如何在一行中输出多个变量

    我试图确定 CSV 中的用户是否处于活动状态 此外 我想知道它们是否是服务帐户 用户帐户或基于 OU 的计算机帐户 一切都在膨胀 直到我尝试输出它 输出分为几行 每个变量一行 我希望输出在一行上 中间有逗号 这样我完成后就会有一个 CSV
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 在打字稿中通过 this 从派生类型调用构造函数

    在我的打字稿中 我尝试通过基类中的方法创建 克隆子对象 这是我的 简化的 设置 abstract class BaseClass
  • 通用 scala 函数,其输入是变量数量的函数

    我想定义一个函数f需要另一个函数g 我们需要g采取采取n双打 对于某些固定n 并返回一个 Double 函数调用f g 应该返回具体值n 例如 f Math max 2因为 Math sin 具有类型 Double Double gt Do
  • 继承的静态成员的静态初始化

    考虑这个示例代码 public class A
  • 对两种类型之间的二元关系进行建模

    有企业 也有人 用户可以对某个企业点赞或发表评论 但效果是一样的can not发生在一个人身上 当用户发布有关某个企业的内容或对其点赞时 该企业就被称为target喜欢或帖子 trait TargetingRelation Targetin
  • 当参数为泛型时,Type.GetMethod 的类型数组中应包含哪些类型?

    如果我想通过反射调用泛型方法 我可以轻松使用this https stackoverflow com questions 232535 how to use reflection to call generic method技术 除非 该方
  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • 使用反射获取通用 IDictionary 的值

    我有一个实现的实例IDictionary
  • Bash 脚本大小限制?

    我有一个 bash 脚本 在 RHEL 或 OS X 上运行时出现以下错误 第 62484 行 意外标记 换行符 附近出现语法错误 第 62484 行 o gz 这是一个自动生成的脚本 用于解决我公司使用的 Grid Engine 计算集群
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • C# List 内部结构

    将对象添加到集合 例如 List 时到底会发生什么 List
  • 如何使用温莎城堡注册通用装饰器?

    我需要装饰一切基于ICommandHandler

随机推荐