2009-11-25 154 views
1

我正在爲EXE製作一個DLL「插件」。 EXE用Object作爲參數調用DLL中的函數,並從那裏開始。通過COM interop在C#中訪問受保護的內存

這一切都正常工作,直到我把它分成一個新的線程。發生此錯誤

嘗試讀取或寫入受保護的 內存。這通常表明 其他內存已損壞。

在新線程執行所述對象對這個代碼時

protected object GetPropertyValue(object obj, string PropertyName) 
    { 
     return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { }); 
    } 

上面試圖COM對象上訪問屬性。將該功能更改爲「公開」不會影響它。代碼工作得很好,但如果我只使用一個線程。

發生了什麼很清楚:新線程無法訪問EXE中的變量。我怎樣才能解決這個問題?不使用線程不是一個可行的選擇。

欣賞任何幫助

回答

4

您的COM對象可能存在於STA中。這意味着你需要發回擁有該對象的線程,並從那裏進行調用。

如果COM對象支持空閒線程,那麼它可能在STA中運行,因爲您的主方法標記有STA線程屬性。

另外,如果你控制COM對象,你可以嘗試使它成爲一個MTA對象。

在這種情況下,請嘗試刪除該屬性。但是,如果您使用Windows窗體,則必須從STA線程創建表單。

+0

我無法控制COM對象 – Lynxy 2009-11-26 20:43:48

+0

但您確實可以控制調用它的線程。如果它是一個STA com對象,則必須從擁有它的線程(它創建的線程)訪問它。 – 2009-11-27 15:35:29

+0

或者,嘗試添加設置BG線程以在創建時使用STA。如果你這樣做,我相信CLR會爲你處理線程調度(使用消息循環)。 只需調用thread.SetAppartmemtState – 2009-11-27 15:45:05