2017-06-01 4 views
0

クラスにオブジェクトをキャストしようとすることができません... 私は動的にDllをロードし、メソッドのパラメータとしてクラスを与えるので、それが必要です。クラスは両方のプロジェクトでリンクされています(同じファイル)。C#オブジェクトからクラス

私がDLLに与えたいと思う私のクラス: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_; 
    } 
} 

コール:クラスをキャストしようとし

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

'miRun'という変数に' GetMethod'を保存していますが、 'm_miRun'を' null'としてチェックしています - それは打ち間違いですか? – Default

+0

投稿する前にコードを変更しましたが、それを変更しませんでした。私はそれを修正した。 – ksklb

答えて

0

同様のシナリオで私は同じ問題を抱えていました。私の場合は、2 assemblysた:

  • 実行
  • Dllファイル

私が上を通過したかったrefferenceの実装は、DLLにあったと私の実行可能ファイルは、参照としてDLLを追加しました。ボットアセンブリは実装について知っていて、コードはコンパイルされます。しかし、実行すると、私はそのinvalidCastExceptionを取得します。私の問題の解決策は、私の参照クラス(あなたのケースではCParams)の実装を入れて、他の両方のプロジェクトでそのDLLを参照するリンクを追加するDLLでした。

0

両方のアセンブリが同じファイルコンテンツを使用しているからといって、それがタイプに含まれているわけではありません。

ランタイムでは、2つのCParamsクラスが2つの全く異なるタイプであるとみなされます。あなたはそれらの間にキャストすることはできません。

両方で参照されるアセンブリに配置する必要があります。

関連する問題