2017-06-01 54 views
0

我不能讓它的工作投給一個類的對象... 我需要,因爲我動態加載一個Dll,並將它作爲方法的參數的類。這個類在兩個項目(同一個文件)中鏈接。C#對象類

我的班級我想給的DLL:

public class CParams 
{ 
    public int m_iFunctionCode = -1; 

    public STTestDll pTestDll; 
    public struct STTestDll 
    { 
     public int m_iSleepTime; 
     public int m_iCount; 
    } 

    public string GetDescriptionText() 
    { 
     return "Starte Dll: Sleeptime=" + pTestDll.m_iSleepTime.ToString() + "; Count=" + pTestDll.m_iCount.ToString() + "; Solldauer=" + 
      (pTestDll.m_iSleepTime * pTestDll.m_iCount/1000).ToString() + " Sekunden"; 
    } 

    public CParams(int iFunctionCode_) 
    { 
     m_iFunctionCode = iFunctionCode_; 
    } 
} 

DLL的調用:

Type typeDll = asmDLL.GetType(strClassName + "." + strClassName); 
object activator = Activator.CreateInstance(typeDll); 
MethodInfo miRun = typeDll.GetMethod("Run"); 
if (miRun != null) 
{ 
    CParams pParam = new CParams(0); 
    pParam.pTestDll.m_iCount = 200; 
    pParam.pTestDll.m_iSleepTime = 25; 
    object[] args = new object[1]; 
    args[0] = pParam; 
    miRun.Invoke(activator, args); 
} 

守則它試圖投類:

public void Run(object objParams) 
{ 
    CParams pParams = (CParams)objParams; 
    MessageBox.Show(pParams.pTestDll.m_iCount.ToString() + " - " + pParams.pTestDll.m_iSleepTime.ToString()); 
} 

錯誤是:InvalidCastException。

+1

在我看來,這兩種方法都知道最終的類型,爲什麼你會依賴方法調用和鑄造?這看起來像是一個對接口的抽象會對你有更多幫助的地方? – Icepickle

+0

您將'GetMethod'保存在一個名爲'miRun'的變量中,但是您正在'm_miRun'中檢查'null' - 是一個錯字嗎? – Default

+0

我只是在發佈之前更改了代碼,並沒有改變這一點。我修正了它。 – ksklb

回答

0

在類似的情況下,我遇到了同樣的問題。在我來說,我有兩個組裝件:

  • 可執行
  • 的Dll

我想越過在DLL和我的可執行文件有DLL添加爲參考REFFERENCE的實現。 Bot程序員知道實現並且代碼會被編譯。但是當執行時,我得到了invalidCastException。我的問題的解決方案是一個額外的DLL,在其中放置我的引用類(在您的情況下CParams)的實現,然後在其他項目中鏈接引用該DLL。

0

僅僅因爲兩個程序集使用相同的文件內容,並不意味着它在Type中。

運行時看到兩個CParams類是兩個完全不同的類型。你不能在他們之間施放。

您需要將它放在兩個引用的程序集中。