为什么可以创建 COM 接口的新实例?

2023-11-24

我对 COM 和 coclass 没有太多背景,所以我不太明白为什么我可以使用new具有接口的操作员。从与语言/框架无关的角度来看,为什么它能正确编译和运行是令人困惑的:

using Microsoft.Office.Interop.Excel;

public class ExcelProgram
{
    static void Main(string[] args)
    {
        Application excel = new Application();
    }
}

检验Application在 Visual Studio 2010 中向我展示:

using System.Runtime.InteropServices;

namespace Microsoft.Office.Interop.Excel
{
    // Summary:
    //     Represents the entire Microsoft Excel application.
    [Guid("000208D5-0000-0000-C000-000000000046")]
    [CoClass(typeof(ApplicationClass))]
    public interface Application : _Application, AppEvents_Event
    {
    }
}

幕后到底发生了什么?


我相信这仅适用于 COM 接口。马克·格拉维尔有一个解释here.

简而言之,COM 接口可以与“默认”实现类配对,这样当您“实例化”接口时,您实际上是在创建该默认实现类的实例。在这种情况下Application您的示例中的界面似乎是ApplicationClass.

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

为什么可以创建 COM 接口的新实例? 的相关文章

随机推荐

  • geom_area 绘图默认堆叠区域

    我在用geom area绘制一个非常简单的数据集 绘图时使用geom line一切正常 但是当我切换到geom area绘制更高的值 我认为查看图表是代表我的问题的最佳方式 require tidyverse x lt structure
  • 在 CPanel 中编辑 DNS 记录的 PHP 脚本

    我想变得自给自足 因此不需要 DNSDynamic 和 DYNDNS 等服务 而且我不喜欢为我自己可以做的服务付费 场景如下 我的主网站由托管公司托管 我还有一个家庭服务器 上面有我的音乐等 但问题是我的 ISP BT 不向消费者提供静态
  • 确保第一个 ajax 函数在第二个之前完成

    我有一个 JavaScript 函数 它使用 jQuery 发出两个连续的 Ajax 请求 我想确保在调用第二个函数之前第一个请求已加载 我有办法做到这一点吗 要么指定async false in the ajax选项 或者进行第二个 aj
  • 样式图标标记 - 融合表

    这是为像我这样的其他新手提供的帮助 我花了很长时间才弄清楚如何在我的融合表项目中将不同的图标分配给不同类别的标记 我发现文档有限且令人困惑 我想如果我感到困惑 那么其他人可能也会如此 在其他人的帮助和大量测试的帮助下 我现在可以与您分享两种
  • JMeter、JUnit 和 Spring Java 配置

    是否可以使用 JUnit 插件 采样器和 Spring Java 配置来运行 JMeter 当我尝试执行此操作时 未创建 Spring 自动装配 bean 尽管测试用例运行 但由于尚未创建 bean 我收到了空指针异常 我正在使用Sprin
  • 如何从 char 数组进行转换 [char; N] 到字符串切片 &str?

    给定一个固定长度char数组如 let s char 5 h e l l o 我如何获得 str 你不能没有一些分配 这意味着你最终会得到一个String let s2 String s iter collect 问题是 Rust 中的字符
  • 如何修复我的包中的“.dist-info 目录未找到”?

    我有一个 Python 2 软件包 我正在尝试将其升级到 Python 3 它是由曾经在我现在所在的同一团队工作的某个人编写的 但他已不再在公司工作 不幸的是 没有人离开公司团队能够提供帮助 对包的文件运行 2to3 后 我运行python
  • R匹配2个以上条件并返回响应值

    您好 我有两个数据集 其中第一个是一组索引 ind1 lt rep c E W times 20 ind2 lt sample 100 150 40 y lt c 1 40 index lt data frame cbind ind1 in
  • 如果内存大小相等,如何将 C 结构体转换为另一种结构体类型?

    我有 2 个矩阵结构意味着相同的数据 但具有不同的形式 如下所示 Matrix type 1 typedef float Scalar typedef struct Scalar e 4 Vector typedef struct Vect
  • 该字符串未被识别为有效的日期时间。有一个从索引 0 开始的未知单词

    我有以下 C 在尝试将字符串解析为日期时间时出现上述错误 DateTime backupdate System Convert ToDateTime imageflowlabel Text DateTime currentdate Syst
  • gTTS直接输出

    我想让聊天机器人做出回应audio和文字 所有使用 gTTS 的示例代码似乎都需要 将文本保存到文件中 然后播放该文件 是否有另一种方法可以简化流程 例如使用 gTTS 自动播放 聊天机器人的响应 如果你简单地看一下the docs 您会看
  • 悬停时开始和暂停 SVG 动画

    当用户将鼠标悬停在以下 SVG 上时 我想对齿轮进行动画处理 也就是说 当鼠标进入时 两个齿轮都开始从它们停止的地方旋转 当鼠标离开时 齿轮会停止在它们所在的任何位置 如果可能的话 我希望动画使用缓入 缓出功能开始和结束 如何使用 SVG
  • 使用 sf 在 R 中求多边形的交集

    我想通过查看 400m 步行 5 分钟 内其他点的数量来评估每个点与其他等效点的空间接近程度 我在地图上有一些点 我可以在它们周围画一个简单的 400 m 缓冲区 我想确定哪些缓冲区重叠 然后计算重叠的数量 这个重叠数应该与原始点相关 这样
  • Tensorflow 跨设备通信

    正如tensorflow论文所述 Tensorflow的跨设备通信是通过在设备中添加 接收节点 和 发送节点 来实现的 根据我的理解 设备 请考虑仅涉及CPU设备 负责执行操作的计算 然而 数据 例如 操作产生的张量 变量缓冲区 驻留在内存
  • 无法使用 ServerSocket.socketBind 分配请求的地址

    当我尝试设置套接字服务器时 收到一条错误消息 Exception in thread main java net BindException Cannot assign requested address JVM Bind at java
  • 用户定义函数中的错误处理

    我想在 SQL Server 2005 中编写一个非 CLR 用户定义函数 该函数接受输入字符串并返回输出字符串 如果输入字符串无效 那么我想向调用者指示错误 我的第一个想法是使用 RAISERROR 来引发异常 但是 SQL Server
  • Core Data 中多语言数据的良好实践

    我的 iPhone 应用程序中需要一个多语言 coredata 数据库 我可以为每种语言创建不同的数据库 但我希望在 iphone sdk 中存在一种自动方式来管理不同语言核心数据中的数据 例如资源和字符串 有人有一些提示吗 我做了一些与
  • (405 Method Not allowed)响应 Google 代码提交期间的 MKACTIVITY

    我已将代码上传到 code google 并成功提交了两次 但现在当我尝试提交代码时 它总是给出 Server sent unexpected return value 405 Method Not Allowed in response
  • 如何在 Visual Basic 中声明全局变量?

    我想创建一个可以跨多种表单使用的变量 它将成为整数的临时存储位置 在 VB 中 有多种方法可以实现此目的 一种 VB 特定的方法和一种非 VB 特定的方法 即也可以在 C 中实现的方法 VB 特有的方法是创建一个模块并将变量放置在模块中 P
  • 为什么可以创建 COM 接口的新实例?

    我对 COM 和 coclass 没有太多背景 所以我不太明白为什么我可以使用new具有接口的操作员 从与语言 框架无关的角度来看 为什么它能正确编译和运行是令人困惑的 using Microsoft Office Interop Exce