2011-08-21 80 views
1

我想動態加載.DLL文件並運行它的一個方法(實際上只有一個方法..),但Activator.CreateInstance方法刪除如果需要的話C#Activator.CreateInstance()刪除「無法創建抽象類」異常

Assembly assembly = Assembly.Load(DLLByteArray); 
//Type typeToExecute = assembly.GetType("ClassLibrary1.Class1"); 
//last line was replaced with the next one to ensure that the name is correct. 
Type typeToExecute = assembly.GetTypes()[0]; 
Object instance = Activator.CreateInstance(typeToExecute); 

類減速:「public static unsafe class Class1」一個「無法創建一個抽象類」異常 這是我的代碼。

.DLL類代碼中的任何內容是否會導致此類異常?

回答

8

你正在嘗試做的事:

Assembly assembly = Assembly.Load(DLLByteArray); 
Type typeToExecute = assembly.GetTypes()[0]; 
typeToExecute.GetMethod("TheMethod").Invoke(null, theArguments); 

將調用一個靜態方法與object[](theArguments)包含所有方法的參數

另一個解決辦法是簡單地從去除static關鍵字類和方法(這將使您當前的代碼工作)

+0

謝謝朋友:) 我正在使用InvokeMember .. – eranj

4

你正試圖創建一個靜態類的實例。你不能這樣做 - 它沒有任何構造函數(一個靜態類既是抽象的也是密封的)。

該消息非常明確:「無法創建抽象類」。

爲什麼你試圖創建這個類的實例?你說你想調用一個方法,但你爲什麼認爲這需要你創建一個實例?即使您可以創建新的實例,您也不應該這樣做,以便調用靜態的方法。我假設的方法是靜態的,否則它不能被放置在一個靜態類...

你應該仔細想想正是你想,當你使用反射做什麼 - 因爲編譯器ISN當你做一些不合情理的事時,你將無法發現。如果沒有反思,就已經能夠:

// Fails at compile-time 
new ClassLibrary1.Class1().WhateverMethod(); 

你需要考慮像一個編譯器,當你使用反射 - 因爲編譯器不能爲你做。

+0

+1。我想知道下一個問題的海報會是什麼? ;) –

+0

提示:閱讀問題的第一行。 – jgauffin

+0

我想從作爲嵌入資源放置的文件運行方法。 – eranj