VB.Net程序设计:Excel开发释放资源问题非杀死Excel进程

很久很久以前就遇到过这个问题。也找到了解决的方法,就是忘记代码是怎么写的,在哪里。

最近也遇到过。只能通过搜索代码,看看代码是怎么写的。

印象中,解决的方法是有掉用System.GC.Collect(),还有说调用这个要和包含有Excel对象的函数分开。

庆幸的是代码里面有记录下方法的来源是:http://bbs.csdn.net/topics/70360199

下面是自己调用的代码:

    Private Sub BtnWrite2File_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles BtnWrite2File.Click
     ‘...
        Select Case Path.GetExtension(My.Settings.strWriteFilePath).ToLower
            Case ".txt"
                Write2Text()
            Case ".xls"
                '參考http://topic.csdn.net/t/20050531/16/4049025.html 18樓
                Write2Excel()
                '否則無法釋放excel資源。
                System.GC.Collect()
                System.GC.WaitForPendingFinalizers()
            Case ".xml"
                Write2Xml()
        End Select
    End Sub

而新项目的代码是在一个多线程中调用Excel的,释放方法采用下面方法,仍然无效。仍然需要测试

Dim th As New Threading.Thread(AddressOf Me.ExportDgv2ExcelFile)
th.IsBackground = True
th.Start()

  Private Sub ExportDgv2ExcelFile()
'创建xlApp程序

      releaseObject(xlApp)

    End Sub

   Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub


--------------------------------

来源记录:

1.设置权限
在 开始->运行 中输入dcomcnfg 回车 会弹出 分布式COM配置属性 窗口
在 应用程序中选择 Microsoft Excel 然后点击属性
在 常规--身份验证级别 中选 无
在 安全性 中选择 使用自定义访问权限,点编集,加入用户asp.net
在 身份标识 中选择交互式用户
点击确定返回

2.使用垃圾回收
GC.Collect();
GC.WaitForPendingFinalizers();
注意:这两个语句不能和excel对象在同一函数中
可以这样写:
private void useExcel()
{
....使用excel;
}
private void Button2_Click(object sender,System.EventArgs e)
{
useExcel();

GC.Collect();
GC.WaitForPendingFinalizers();
}

忘说了,程序中,如果象上面说的那样做的话 下面释放com的语句根本不需要了 System.Runtime.InteropServices.Marshal.ReleaseComObject(UsedRange); 垃圾回收会释放所有资源

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...