我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.
我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?
考虑以下代码:
public class Class1
{
public static int c;
~Class1()
{
c++;
}
}
public class Class2
{
public static void Main()
{
{
var c1=new Class1();
//c1=null; // If this line is not commented out, at the Console.WriteLine call, it prints 1.
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Class1.c); // prints 0
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,即使main方法中的变量c1超出范围并且在GC.Collect()调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?
我正在准备一个Visual Basic 2005上的一个类,目标是Visual Basic 6程序员迁移到.NET平台.
我想就是否建议他们始终启用Option Strict提出建议.
我专门使用C风格的编程语言,主要是Java和C#,所以对我来说,显式的转换是我一直希望我必须做的事情,因为它从来都不是一个选择.
但是我认识到使用内置支持后期绑定的语言的价值,因为不必过分明确代码中的类型确实可以节省时间.动态类型语言的流行扩散进一步证明了这一点即使在具有动态语言运行时的.NET平台上也是如此.
考虑到这一点,如果第一次使用VB.NET和VB6背景接近.NET的人应该被鼓励进入必须使用编译时类型检查的思维模式,因为这是"最佳实践". CLR?或者继续享受后期约束的好处是"还可以"吗?
我正在使用
[DllImport("Oleacc.dll")]
static extern int AccessibleObjectFromWindow(
int hwnd,
uint dwObjectID,
byte[] riid,
ref Excel.Window ptr);Run Code Online (Sandbox Code Playgroud)
使用他的句柄获取Excel实例,我从excel实例的进程ID获取.
这就是我使用这些功能时的样子
const uint OBJID_NATIVEOM = 0xFFFFFFF0;
Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
Excel.Window ptr = null;
int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM,
IID_IDispatch.ToByteArray(), ref ptr);
Object objApp = ptr.Application;Run Code Online (Sandbox Code Playgroud)
这种代码安静很有效,但唯一的问题是我必须添加对Office 2003主互操作程序集的引用.
正如你所看到的,函数中的最后一个参数是我需要添加对Pias的引用的原因,所以我的问题是如果有一种方法可以避免使用Interop程序集,我尝试过后期绑定但是也许我一直在做错,因为我无法让它发挥作用.
嘿家伙我有一个小问题,我似乎无法弄明白.我将DataGridView(它的内容)保存到xls文件.我没有遇到任何问题,除了我的任务管理器,它仍然显示它正在运行.我打过电话:
xlApp.Application.Quit()
Run Code Online (Sandbox Code Playgroud)
这被声明为:
Dim xlApp As New excel.Application
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,但这与我让用户选择将其导出到Word文档时退出的方式相同.我不知道我哪里错了...
这是我的完整代码
Imports Word = Microsoft.Office.Interop.Word
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For x As Integer = 1 To 3500
DataGridView1.Rows.Add(New Object() {"r" & x.ToString & "c1", "r" & x.ToString & "c2", "r" & x.ToString & "c3", "r" & x.ToString & "c4", "r" & x.ToString & "c5"})
Next
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As …Run Code Online (Sandbox Code Playgroud) 我面临的问题是,即使在调用 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) excel ×4
.net ×3
c# ×3
vb.net ×3
interop ×2
com ×1
com-interop ×1
exit ×1
late-binding ×1
xls ×1