2009-06-13 53 views
2

我正在處理一些大型非託管庫的包裝。幾乎所有的函數都可以在內部調用一些錯誤處理程序。默認錯誤處理程序向控制檯寫入錯誤並調用abort()函數。這種行爲對於託管庫來說是不可取的,所以我想用我自己的缺省錯誤處理程序替換它,只會拋出一些異常並讓程序在處理此異常之後繼續正常執行。必須在調用任何包裝函數之前更改錯誤處理程序。
包裝庫是用託管的C++編寫的,具有到包裝庫的靜態鏈接,所以沒有像「具有數百個dll導入的類型」那樣存在。我也找不到一個由wrapper庫中的所有東西使用的類型。所以我不能通過在一個單一類型中定義靜態構造函數來解決這個問題,這將執行我需要的代碼。在程序集上執行代碼加載

我目前看到解決該問題的方法有兩種:

  1. 這樣定義Library.Initialize()必須由客戶端調用之前的一次他的代碼將使用包裝圖書館的任何部分一些靜態方法。

  2. 找到每個頂級函數使用的類型的最小子集(我認爲這個子集的大小將類似25-50類型),並添加靜態構造函數調用Library.Initialize(這將是在這種情況下內部)到這些類型的每一個。

我讀過thisthis問題,但他們並沒有幫助我。有沒有解決這個問題的適當方法?也許有一些很好的黑客可用?

回答

0

我認爲你的選擇2更好。如果你將呼叫包含在一些額外的類型中,那就這樣吧。當然,如果Library.initialize已經被調用,那麼你可以保留它。

0

雖然可能有點誇張,但是您可以創建自己的包裝類,只展示您想要的功能。在每個這些功能中,您都可以執行錯誤處理。

1

一對夫婦的其他建議:

  1. 創建一個抽象基類爲根的所有包裝類,並把初始化調用構造函數的基類。
  2. 給所有對象的內部構造函數,並強制客戶端通過某些工廠方法實例化它們,然後在返回對象實例之前執行初始化。