2012-09-13 126 views
0

我正在構建C#.net 3.5應用程序。動態加載DLL時未找到方法

我有一個exe 'MainApp' 它引用一個DLL 'CommonDll'

的CommonDll動態加載另一個DLL 'LoadedDll' 和動態調用方法調用FUNC()。

在 'LoadedDll' 引用 'CommonDll'

在 'CommonDll'

有一個方法foo()其中FUNC()正在呼叫。

func() 
    { 
     foo(); 
    } 

所以,我們到目前爲止有:

MainApp ==> CommonDll ==動態地==> LoadedDll

LoadedDll ==> CommonDll。直到我改變了方法foo()以獲得一個布爾參數:foo(bool val);也cheanged的FUNC()在 'LoadedDll' 到

func() 
{ 
foo(true); 
} 

我在版本1.1

的MainApp(引用舊CommonDll)的1.0版本,並LoadedDll(引用新CommonDll)對於某些原因,我得到一個「MethodNotFound Excepion」方法foo說它找不到foo獲得布爾參數。

這是怎麼發生的? LoadedDll正在使用對已更新的CommonDll的靜態引用,所以爲什麼它找不到該方法?

此外,該異常並不是說它找不到'func()'方法,它是動態加載的,但它說它找不到foo方法。

編輯:

我看着在GAC的DLL,但它是不存在的,是有原因的舊的DLL已在內存將被加載,而不是新的另一個原因?

+1

顯示您的dll加載代碼。 –

+0

我把它用於反射來調用這些?如果你是,你是否將參數對象數組傳遞給invoke方法? – LukeHennerley

+0

嘗試重建應用程序。 –

回答

0

我想出了問題的原因。

有一些外部代碼將dll版本鎖定爲一個常量值,因此強名稱是相同的。

按鈕行:如果您正在加載dll,然後嘗試加載具有相同強名稱的另一個dll,則會使用第一個dll。

爲了加載2個具有相同名稱的dll,它們必須具有不同的強名稱。

0

它也發生在我身上。我從動態加載dll的目錄中刪除了所有額外的dll(它們的依賴關係,這些dll以前已經加載了我的主要exe文件)。你的答案中的原因是正確的。