我創建一個VSTO絲帶外接程序爲Excel,和我存儲我的應用程序工作簿的一些狀態信息,我用它來更新啓用視覺按鈕啓用按鈕。考慮到可以有多個工作簿,我將這個狀態對象存儲在ThisAddIn類的字典中。我的問題是,我不知道如何獲得工作簿的唯一哈希/鍵/ Guid,因爲我所得到的是一個不斷更改哈希的COM包裝器。夠公平的,我完全明白這一點。我用了很長時間獲取的哈希碼Excel工作簿中VSTO基於狀態
一種解決方案是創建一個GUID,並將其存儲在CustomDocumentProperties工作簿,並根據,作爲一個關鍵的狀態映射。這至少可以工作,但如果我創建工作簿的副本並在相同的應用程序實例中打開該工作簿,並且現在具有多個具有相同GUID的工作簿,則失敗。
我剛剛有一個想法,現在我想我可以在Workbook_Open事件中刷新此Guid。但是,這仍然是一個狡猾的解決方案。
第二個解決方案,我發現在這裏: http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/04efa74d-83bd-434d-ab07-36742fd8410e/
所以我使用的球員代碼和創造了這個:
public static class WorkbookExtensions
{
public static IntPtr GetHashery(this msExcel.Workbook workbook)
{
IntPtr punk = IntPtr.Zero;
try
{
punk = Marshal.GetIUnknownForObject(workbook);
return punk;
}
finally
{
//Release to decrease ref count
Marshal.Release(punk);
}
}
}
它非常好幾分鐘,直到它開始給我臭名昭著錯誤「訪問Application.ActiveWorkbook時,不能使用與其基礎RCW分離的COM對象」。
這是引用該工作簿COM對象的一種安全的方法? 如果我有兩個使用此方法獲取單個工作簿GUID的功能區應用程序,該怎麼辦? 如果這些應用程序的一個運行我的國家,對象的垃圾收集器,它要求一個終結調用Marshal.FinalReleaseComObject(簿)什麼? 有沒有什麼辦法可以獲得工作簿的參考計數,以便在其他功能區應用程序完成之前不調用FinalRelease? 清理VSTO中的Workbook COM對象以保持與其他應用程序公平對待的一些最佳做法是什麼?
當然我不是第一人,希望有按鈕啓用基於工作簿狀態,怎麼每個人都這樣做呢?我在Stack Overflow上看過一些其他文章,但沒有一篇能夠幫助我解決Workbook Guid解決方案。
我正在使用功能區設計器,並連接到工作簿加載和停用事件。提前
感謝,希望香港專業教育學院包括所有的細節。
**已從其基礎R分離的COM對象CW無法使用** - 是的,我討厭這個錯誤它的PITA,閱讀此:http://jake.ginnivan.net/vsto-com-interop – 2013-04-11 03:53:37
爲什麼你釋放IUnknown指針在相同的功能?只有在工作簿已關閉或類似的情況下,才能保留並釋放它。 – 2013-04-11 05:38:39
輝煌,謝謝@JeremyThompson!這篇文章有很多要學習。 VSTOContrib看起來對我的下一個項目來說很好,但它並不能解決我眼前的問題。 @SimonMourier - 我對本地代碼不是很瞭解,但是我想如果我不在這裏釋放指針,那麼我會失去它以後再發布的軌跡? – stuzor 2013-04-11 16:25:19