2013-02-14 17 views
1

我看到這個問題在SO上有相當的數量,並且我遵循了這個建議,但是我似乎做錯了什麼。該DLL似乎加載罰款,但對象CreateInstance返回爲空。如何從加載的DLL獲取對象

我有這個DLL:

namespace Backfill 
{ 
public class Module : Kernel.Module 
{ 
    public override void ModuleStart() 
    { 
     //Stuff 
    } 
} 
} 

在另一個DLL有不同的命名空間

namespace Kernel 
{ 

public abstract class Module 
{ 
    public abstract void ModuleStart(); 
} 



public static void KernelStart() 
    { 
     string load_dll = @"Path to DLL"; 

     Assembly test_dll = Assembly.LoadFile(load_dll + ".dll"); 

     Module test_mod = (Module)test_dll.CreateInstance("Kernel.Module"); 

     test_mod.ModuleStart(); 
    } 
} 

(Module)test_dll.CreateInstance("Kernel.Module");被返回null,雖然。任何想法爲什麼?

+1

第一個DLL中的具體類也在'Kernel'命名空間中嗎? – antonijn 2013-02-14 20:45:35

+0

@Antonijn是的,我應該指定,第一個DLL是在一個完全不同的名稱空間,並引用'Kernel'庫來繼承'Module'類。 – cost 2013-02-14 20:59:21

+0

那是什麼名字空間? – antonijn 2013-02-14 21:01:15

回答

4
(Module)test_dll.CreateInstance("Kernel.Module") 

這是行不通的。如您所述,Module類您嘗試實例化(我認爲這是第一個DLL的類),它不在名稱空間Kernel中,而在Backfill名稱空間中。因此,你應該有這樣的一些東西:

(Module)test_dll.CreateInstance("Backfill.Module") 
2

Kernel.Module是一個抽象類。你不能直接創建它的一個實例。您需要創建派生類的實例。

編輯:自提供更多信息:

@Antonijn有同樣的答案。你需要直接指定你想要的類型。 BackFill.Module似乎是正確的。

編輯之前:

如果您在多個組件相同的名字,然後喲需要使用完全合格(包括程序集名),你想要的類型。例如:https://stackoverflow.com/a/2300428/30225作爲可能的答案。

+1

我沒有指定,對不起,第一個DLL是在一個單獨的命名空間,並且只爲了繼承Module而引用了Kernel庫。在這種情況下,我將如何在新加載的DLL中創建派生類的實例? – cost 2013-02-14 21:01:13