开发 Excel Addin 时释放 COM?

2024-04-03

我知道在使用互操作时应该释放 COM 对象。开发和加载项(例如 Excel)时情况是否有点不同?这是我的一个循环,我很好奇是否Marshal.ReleaseComObject是必要的?

 foreach (var sheet in results.Sheets)
            {
                var newSheet = workbook.AddSheet();

                newSheet.SetSheetTabColor(sheet.TabColor);
                newSheet.SetSheetName(sheet.TabName);
                newSheet.Cells.SetFont("Calibri", 8);
                newSheet.FreezeRow(1);

                var endRow = sheet.Data.GetUpperBound(0) + 1;
                var endColumn = sheet.Data.GetUpperBound(1) + 1;

                var writeRange = newSheet.SetWriteRange(1, 1, endRow, endColumn);



                writeRange.Value2 = sheet.Data;

                newSheet.AutoFitColumns();
                newSheet.RemoveColumn(1);

                Marshal.ReleaseComObject(newSheet);

            }

另外,我创建了一个带有扩展方法的库。一个例子是workbook.AddSheet() AddSheet看起来像这样:

public static Worksheet AddSheet(this Microsoft.Office.Interop.Excel.Workbook workbook)
        {
            var sheets = workbook.Sheets;

            return sheets.Add(After: sheets[sheets.Count]);
        }

由于我正在访问sheets from workbook.Sheets,我必须释放这个对象吗?如果是这样,我在哪里退回工作表?回来之前不能释放吗?

这可能是一个愚蠢的问题,但如果Marshal.ReleaseComObject在 foreach 作用域中不是必需的,即使它仍然存在也会有伤害吗?


Marshal.ReleaseComObject仅当您需要及时或按特定顺序控制 COM 对象的生命周期时才使用。对于 COM 对象的随意使用 i不会建议您完全使用此方法。

Check here https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v=vs.110).aspx

该方法用于显式控制 COM 对象的生命周期 从托管代码中使用。您应该使用此方法来释放 及时保存对资源的引用的底层 COM 对象 方式或必须以特定顺序释放对象时。

关于你的第二个问题

由于我正在访问工作簿中的工作表。Sheets,我是否必须释放 这个物体的?如果是这样,我在哪里退回工作表?我不能 在我回来之前释放?

.NET中的COM实现是使用引用计数机制来检测对象是否被使用,所以NO您不必明确发布任何内容。框架负责这个。

NOTE:使用适当的 .Close(for Workbook), .Quit(for 应用)正确释放资源的方法。当你使用 .Quit() 在应用程序对象上,您将关闭 Windows 中的 Excel 进程(因此这将释放所有资源),并且 .Close() 在工作簿上释放文件锁..等在特定的 Excel 文件上。

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

开发 Excel Addin 时释放 COM? 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐