需要參考的代碼是:
Dim oXL As Microsoft.Office.Interop.Excel.Application
Dim oWBS As Workbooks
Dim oWB As Workbook
Dim oSheet As Worksheet
oXL = CreateObject("Excel.Application")
oWBS = oXL.Workbooks
oWB = oWBS.Add
下面給出的詳細解釋總結: 在上面的代碼中,oXL、oWBS、oWB 和 oSheet 都是存盤參考。根據定義,參考必須指向記憶體位置。我想了解的是它們是否指向相同或不同的記憶體位置?
我的想法:我用粗體突出了我的問題
我的猜測是這些代表各種參考的記憶體位置都彼此不同。我想象的表示如下。Say oXL(代表 Excel 應用程式)指向記憶體中的位置“A”。在Workbooks property回傳的一個實體Workbooks collection。oWBS存盤由回傳的參考oXL.Workbooks并指向一個新位置,比如標記到位置 A 的 B。我提到“標記”是因為它oWBS是針對oXL. 參考oWBS可以訪問 ADD 方法。當執行 ADD 方法時,它會添加一個作業簿,或者在更專業的術語中回傳一個 WORKBOOK 物件(這也是一個參考)。oWB存盤此參考,并且根據定義必須指向某個記憶體位置,例如 C 標記為 B。
我的問題:A、B、C 都是不同的記憶體位置嗎?雖然我可能錯了,但我仍然可以想象 A 和 B 是單獨的記憶體位置。但是B和C呢?代表作業簿集合 (B) 的記憶體位置和實際保存作業簿的位置(其中有一張紙)是 C——它們真的應該是不同的位置嗎?如果沒有,那么有兩個參考oWBS,并oWB指向同一個位置-如何解釋?
概括上述思路,是否意味著每當我們執行oXL.Workbooks.ADD添加新作業簿時,都會回傳三個參考?
- 表示 excel 應用程式的參考
- 表示
oXL.Workbooks集合實體的參考 - 表示添加的單個作業簿的參考
現在讓我們將作業表添加到作業簿,使用_Workbook.Worksheets.ADD. 擴展上述推理,我們是否會再次獲得_Workbook.Worksheets和Worksheets.ADD?? 的唯一參考(指向新的記憶體位置)?
另外,我想說這更像是一種學術好奇心。
uj5u.com熱心網友回復:
根據定義,參考必須指向記憶體位置。我想了解的是它們是否指向相同或不同的記憶體位置?
在 COM 世界中,物件參考并不指向記憶體位置,尤其是在用 VB.NET 撰寫的托管應用程式中。在 .Net 中,您處理一個 RCW 物件,該物件將您的呼叫路由到 COM 物件。在 MSDN中的Runtime Callable Wrapper文章中閱讀更多相關資訊。它宣告如下:
運行時為每個 COM 物件只創建一個 RCW,無論該物件上存在多少參考。運行時為每個物件的每個行程維護一個 RCW。如果您在一個應用程式域或單元中創建 RCW,然后將參考傳遞給另一個應用程式域或單元,則將使用第一個物件的代理。注意,這個代理是一個新的托管物件,與初始的 RCW 不同;這意味著兩個托管物件不相等,但代表同一個 COM 物件。
例如,在 COM 世界中,當您呼叫一個屬性或方法時,該oXL.Workbooks屬性會回傳一個Workbooks類的實體并增加相應 COM 物件的參考計數器。比如說,如果你在 raw 中呼叫該屬性兩次,你將在 .NET 中獲得一個新的物件實體,并且參考計數器將增加兩次。在這種情況下,您需要為Marshal.ReleaseComObject回傳的每個物件呼叫以減少參考計數器。
最后,您可能會發現Excel 為什么不退出?文章有幫助。
此外,在這種情況下,有沒有辦法顯示對 COM 物件的參考計數?
該Marshal.ReleaseComObject的方法回傳與一個COM物件相關聯的RCW的參考計數的一個新值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405795.html
標籤:
下一篇:vb.net上傳帶有標題和描述的影像從jQuery(blueimp/jQuery-File-Upload)獲取值
