相关疑难解决方法(0)

使用IDisposable清理Excel Interop对象

在我的公司中,发布Excel Interop Objects的常用方法是使用IDisposable,方法如下:

Public Sub Dispose() Implements IDisposable.Dispose
    If Not bolDisposed Then
        Finalize()
        System.GC.SuppressFinalize(Me)
    End If
End Sub

Protected Overrides Sub Finalize()
    _xlApp = Nothing
    bolDisposed = True
    MyBase.Finalize()
End Sub
Run Code Online (Sandbox Code Playgroud)

IDisposable构造函数中以下列方式创建的位置:

Try
    _xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
Catch e As Exception
    _xlApp = CType(CreateObject("Excel.Application"), Excel.Application) 
End Try
Run Code Online (Sandbox Code Playgroud)

并且客户端使用_xlApp执行有关excel互操作对象的代码.

我们完全避免使用双点规则.现在我开始研究如何重新发布(Excel)互操作对象以及我发现的几乎所有关于它的讨论如何正确清理excel互操作对象释放Excel对象主要使用Marshal.ReleaseComObject(),它们都没有使用IDisposable接口.

我的问题是:使用IDisposable Interace释放excel互操作对象有什么缺点吗?如果是这样,这些不利因素是什么.

.net vb.net excel interop com-interop

25
推荐指数
1
解决办法
7778
查看次数

截至今天,使用COM对象的正确方法是什么?

这是一个非常常见的问题,我决定问这个问题,因为这个问题在今天可能会有不同的答案.希望这些答案有助于理解使用COM对象的正确方法.就个人而言,在对此主题发表不同意见后,我感到非常困惑.

在过去的5年中,我曾经使用COM对象,规则对我来说非常清楚:

  1. 在代码行中使用单个句点.使用多个句点在场景后面创建无法明确释放的临时对象.
  2. 不要使用foreach,而是使用for循环,并在每次迭代时释放每个项目
  3. 不要调用FInalReleaseComObject,而是使用ReleaseComObject.
  4. 不要使用GC释放COM对象.GC意图主要用于调试用法.
  5. 以与创建对象相反的顺序释放对象.

你们中的一些人在阅读完最后一行后可能会感到沮丧,这就是我所知道的如何正确创建/发布Com对象,我希望能得到更清晰无误的答案.

以下是我在这个主题上找到的一些链接.他们中的一些人告诉他们需要调用ReleaseComObject而其中一些不需要.

"...在VSTO场景中,您通常不必使用ReleaseCOMObject......."

"...您应该使用此方法释放包含引用的基础COM对象......"

更新:

这个问题被标记为过于宽泛.根据要求,我将尝试简化并提出更简单的问题.

  1. 使用COM对象或调用GC是否正确时,是否需要ReleaseComObject?
  2. VSTO方法是否会改变我们以前使用COM对象的方式?
  3. 我写的上述哪些规则是必需的,哪些是错的?还有其他人吗?

.net c# vb.net com excel

11
推荐指数
1
解决办法
2041
查看次数

Excel进程未在VB.net中关闭

我正在使用interop.excel创建一个excel文件,并且该进程未关闭.这是我试图使用的代码.

 Private Sub converToExcel(fileLoc As String, ds As DataSet)
    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkBooks As Excel.Workbooks
    Dim xlWorkSheet As Excel.Worksheet
    Dim misValue As Object = System.Reflection.Missing.Value
    Dim i As Integer
    Dim j As Integer

    xlApp = New Excel.Application
    xlWorkBooks = xlApp.Workbooks
    xlWorkBook = xlWorkBooks.Add(misValue)
    xlWorkSheet = xlWorkBook.Sheets("sheet1")

    For i = 0 To ds.Tables(0).Rows.Count - 1
        For j = 0 To ds.Tables(0).Columns.Count - 1
            xlWorkSheet.Columns.NumberFormat = "@"
            xlWorkSheet.Cells(i + 1, j + 1) = String.Format("{0}", ds.Tables(0).Rows(i).Item(j).ToString()) …
Run Code Online (Sandbox Code Playgroud)

vb.net com excel interop

8
推荐指数
2
解决办法
4万
查看次数

在VB.net关闭后,Excel进程仍然运行

我的问题基本上就是如何结束使用excel时运行的Excel.exe进程.在应用程序中,我打开并使用带有几张纸的excel工作簿,然后将它们留给用户随意使用,我的问题是我的应用程序永远不会放弃Excel流程.

如果在关闭excel之前关闭了应用程序,则关闭excel时进程结束,否则如果在关闭excel后关闭我的应用程序,则该进程将继续运行.

我已经尝试了一些我在互联网上发现的与GC.collect有关的东西,等待待定的终结器或者其他类似的东西但是都没有用.

我也可以愉快地关闭excel流程,唯一的问题是不知道我是否正在关闭他们已经忽略但尚未保存的用户重要电子表格.

我不确定我的代码是否有任何帮助,但我使用microsoft.office.interop.excel来获得excel,并且我正在使用已保存在应用程序资源文件夹中的工作簿.

-编辑-

这是我尝试过的一切,我知道它有点矫枉过正,但遗憾的是它仍然没有结束这个过程

Marshal.ReleaseComObject(FirstWorksheet)
Marshal.FinalReleaseComObject(FirstWorksheet)
Marshal.ReleaseComObject(SecondWorksheet)
Marshal.FinalReleaseComObject(SecondWorksheet)
Marshal.ReleaseComObject(ThirdWorksheet)
Marshal.FinalReleaseComObject(ThirdWorksheet)
Marshal.ReleaseComObject(FourthWorkSheet)
Marshal.FinalReleaseComObject(FourthWorkSheet)
Marshal.ReleaseComObject(xlRange)
Marshal.FinalReleaseComObject(xlRange)
Marshal.ReleaseComObject(SecondxlRange)
Marshal.FinalReleaseComObject(SecondxlRange)
Marshal.ReleaseComObject(thirdxlRange)
Marshal.FinalReleaseComObject(thirdxlRange)
Marshal.ReleaseComObject(fourthxlRange)
Marshal.FinalReleaseComObject(fourthxlRange)
Marshal.ReleaseComObject(.activeworkbook)
Marshal.FinalReleaseComObject(.activeworkbook)
Marshal.ReleaseComObject(excelApplication)
Marshal.FinalReleaseComObject(excelApplication)
MSExcelControl.QuitExcel() 'A function made by someone else I work with that was meant to close excel's process
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
Run Code Online (Sandbox Code Playgroud)

-Edit-这是quitExcel方法

Friend Shared Sub QuitExcel()
    If Not getExcelProcessID = -1 Then
        If Not excelApp Is Nothing Then
            'Close and quit
            With excelApp
                Try
                    Do Until .Workbooks.Count = 0
                        'Close all open documents …
Run Code Online (Sandbox Code Playgroud)

vb.net excel interop garbage-collection

4
推荐指数
1
解决办法
2万
查看次数

使用 VB.NET 获取正在运行的 Excel 实例

我从这个答案中获取了以下工作代码:

Option Compare Binary
Option Explicit On
Option Infer On
Option Strict Off

Imports Microsoft.Office.Interop
Imports System.Collections.Generic
Imports System.Runtime.InteropServices

Friend Module Module1
    Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowsProc, ByVal lParam As IntPtr) As Boolean
    Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hWnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    Private Delegate Function EnumWindowsProc(ByVal hwnd As …
Run Code Online (Sandbox Code Playgroud)

vb.net com excel exception excel-interop

3
推荐指数
1
解决办法
7430
查看次数

VB.Net - Excel COM 对象未发布

我面临的问题是,即使在调用 ReleaseComObject 和 GC.Collect 方法后,Excel Process 仍保持活动状态。

我的 Excel 进程终止,但仅在我关闭用户表单后才终止

下面是示例代码,显示了我为摆脱 Excel Process 所做的所有事情:

Public Class frmTEST
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim objExcel As xl.Application
        Dim wbReport As xl.Workbook = Nothing

        objExcel = CreateObject("Excel.Application")

        Try
            wbReport = objExcel.Workbooks.Open("D:\EL\Nicolas\VS Online\Classe A v2\Launcher-v2.2\Resources\Modules\Zoom.xlsm")
        Catch ex As Exception
            Common.WriteDebugLog("Exception line 44")
        End Try
        If wbReport Is Nothing Then
            MsgBox("Erreur d'ouverture du reporting - Code 745.", vbExclamation)
            Exit Sub
        End If

        With objExcel
            .Visible = False
            .ScreenUpdating = …
Run Code Online (Sandbox Code Playgroud)

.net vb.net com excel interop

1
推荐指数
1
解决办法
1690
查看次数