4 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
共享一份DLL
-------------
原因涉及DLL加載和運(yùn)行機(jī)制,主要有兩點(diǎn):
1)DLL動(dòng)態(tài)鏈接庫無法獨(dú)立運(yùn)行,必須由一個(gè)應(yīng)用程序進(jìn)程加載到進(jìn)程空間后才能使用。加載DLL的進(jìn)程稱為宿主進(jìn)程。被加載的DLL屬于宿主進(jìn)程,不屬于宿主進(jìn)程內(nèi)某個(gè)線程。
2)宿主進(jìn)程可以重復(fù)調(diào)用,甚至重復(fù)加載DLL。第1次調(diào)用DLL或第1次加載DLL時(shí),宿主進(jìn)程將DLL引入進(jìn)程空間。一旦宿主進(jìn)程成功加載DLL,隨后的重復(fù)調(diào)用或重復(fù)加載只會(huì)增加“引用計(jì)數(shù)”,而不會(huì)加載多份DLL,所以進(jìn)程中只有一份DLL。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
C#本身就能支持線程,為什么還要多此一舉的去調(diào)用DLL創(chuàng)建線程了.
印象中微軟說過不要再DllMain中創(chuàng)建線程,否則會(huì)死的很慘.可以查閱MSDN.
不過導(dǎo)出函數(shù)中應(yīng)該是可以創(chuàng)建線程的...應(yīng)該是你的代碼寫滴不對(duì),不過沒必要舍近求遠(yuǎn)吧

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
應(yīng)該是你的A函數(shù)的實(shí)現(xiàn)寫在頭文件里了。A里面調(diào)用了thread_create,但是thread_create的實(shí)現(xiàn)沒有從dll里export出來,所以就出這個(gè)錯(cuò)。
解決辦法:把A函數(shù)的實(shí)現(xiàn)寫到C文件里,頭文件里只包含一個(gè)聲明就夠了。 記得導(dǎo)出A函數(shù)。。。
thread_create不需要導(dǎo)出。一個(gè)原則:只要你的客戶端(就是調(diào)用DLL的程序)代碼能看見thread_create,肯定就會(huì)有問題。你只要把A函數(shù)放到dll代碼的C文件里,頭文件里只留個(gè)聲明,這樣客戶端就看不到thread_create,也就不會(huì)出現(xiàn)剛才那個(gè)錯(cuò)誤。
- 4 回答
- 0 關(guān)注
- 1776 瀏覽
添加回答
舉報(bào)