2011-06-28 27 views
2

首先,對不起我的英文。PowerBuilder 11.5和C#COM組件的內存問題

我開發C#中的COM組件(實現IDisposable)使用它從PowerBuilder的是這樣的:

OLEObject lole_comComponent 

lole_comComponent = Create OLEObject 
lole_comComponent.ConnectToNewObject("MyComComponent") 

[Do some stuff...] 

lole_component.DisconnectObject() 
destroy lole_component 
GarbageCollect() 

有了這個代碼,COM組件的析構函數被觸發時關閉德的應用程序。我已經爲調用私有Dispose方法的組件添加了一個方法。類似這樣的:

OLEObject lole_comComponent 

lole_comComponent = Create OLEObject 
lole_comComponent.ConnectToNewObject("MyComComponent") 

[Do some stuff...] 

lole_component.Close() // this method calls Dispose(true) 
lole_component.DisconnectObject() 
destroy lole_component 

GarbageCollect() 

在這兩個例子中,組件使用的內存都沒有釋放。

如何釋放COM組件使用的內存?

我使用的PowerBuilder 11.5.1構建4740

+0

你可以發佈你的C#類的''.Dispose()'方法的代碼嗎? –

+0

@David就像這樣http://msdn.microsoft.com/es-es/library/system.idisposable(v=vs.80).aspx#Y480 – Merrin

+1

你在做什麼像'lole_thing = lole_component.SomeThing' ?如果是這樣,你還需要斷開並銷燬'lole_thing'。 –

回答

1

我會承認是對誰是在這種情況下,PowerBuilder中或控制擁有的記憶模糊,但有一個事實可能會有所幫助(或不是)PowerBuilder傾向於將其從操作系統分配給內存。理論上說,內存請求是性能昂貴的操作,所以它不會經歷循環的請求和釋放內存(PB不知道下一步要做什麼),而是掛在它所請求的內存上,而不是現在需要。

HTH,

特里。

+0

我明白了。 我的PB應用程序作爲Windows服務運行,並接收執行操作的請求,其中一個操作需要COM組件。 如果我不能釋放某些對象(在這種情況下,受其它COM組件影響的OLEObjects除了它會影響ConnectToNewObject)會使服務的內存增加,直到崩潰,通常是內存問題。 還有一件事... COM組件很簡單,我認爲這並不需要先進的內存管理。儘管如此,所有實現IDisposable以正確釋放。 – Merrin

+0

所以,要明確的是,當PowerBuilder掛在內存上時,它*會*重用它。第二次調用COM對象時,PB可以重新使用第一次分配的內存,假設它尚未被別的東西使用。除非存在內存泄漏,否則我所描述的PB的這種特性不會讓你耗盡內存。 – Terry

+0

它給人的印象是內存不會被重用,因爲每次調用COM組件時,內存都會增長。 150-300K – Merrin