2013-03-14 46 views
2

我有一個數據轉儲的exe文件。該exe會根據配置動態地選取DLL,並將類對象傳遞給它。該DLL具有與其一起編譯的此類的副本,並且可以在調試下看到數據,而不會將問題作爲對象。但是,當我嘗試將其轉換爲課程時,它會告訴我由於上下文無法進行。我確信我有時忽略了一些事情,因爲我有時會那樣做。InvalidCastException,錯誤的上下文?

錯誤:

[A]MyClass cannot be cast to [B]MyClass. Type A originates from 'MyExe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 'C:\MyPath\MyExe.exe'. Type B originates from 'MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' at location 'C:\MyPath\MyDLL.dll'.

EXE代碼:

Object[] param = new Object[] { MyClass }; 
MethodInfo m = type.GetMethod("MyMethod"); 
reader = (SqlDataReader)m.Invoke(obj, param); 

DLL代碼:

public SqlDataReader MyMethod(Object param) 
{ 
    SqlDataReader reader = new SqlDataReader(); 
    Type t = param.GetType(); //Returns MyClass 

    if (param is MyClass)  //Returns false 
     reportItem = (MyClass)param; //Never executes 

    MyClass reportItem = (MyClass)param; //InvalidCastException 

    //other code here, pulling data 
    return reader; 
} 
+0

我的猜測是你必須動態地創建你傳入的類對象作爲參數。或者在MyMethod中,使用傳入對象的屬性創建一個新的MyClass。 – 2013-03-14 14:53:59

回答

3

The DLL has a copy of this class compiled with it

不要這樣做,基本上。您應該有類型的一個組件,並且只有一個組件。就CLR而言,這些是完全不同的類型。

您可能想要擁有一個公共庫和插件,您的應用程序可以引用。或者你可以讓你的插件引用應用程序的可執行文件並將其保存在那裏。

+0

我有兩個共同的對象,但它們專門用於SQL或日誌記錄。我會創建另一個,並試試這個。謝謝。 – Switch 2013-03-14 14:58:02

+0

工作,謝謝。 – Switch 2013-03-14 16:04:26