2012-04-30 5 views
0

DLLを動的にロードしてオブジェクトを構築します。私は空のコンストラクタを使用してオブジェクトを構築するために管理反映と代理を使用してDLLを動的にリンクする

MyDllClass.cs

namespace MyDllNameSpace 
{ 
    public class MyDllClass 
    { 

     private EventCallBack m_DelegateCallBack = null; 

     public MyDllClass(EventCallBack eventCallBack) 
     { 
      m_DelegateCallBack = eventCallBack; 
     } 

     public MyDllClass() 
     { 
     } 
     ... 
    } 
} 

MyDllCallBackNameSpace.cs

namespace MyDllCallBackNameSpace 
{ 
    public delegate void EventCallBack(string message); 
} 

:(剥離unrelevant部)を次のように私のコードは、おおよそですしかし私は他のコンストラクタを動かすことができませんでした。私はここでArgumentException

at System.Reflection.RuntimeConstructorInfo.InternalInvoke() 
at System.Reflection.RuntimeConstructorInfo.Invoke() 
at System.Reflection.ConstructorInfo.Invoke() at MyProgram.InitMyObject() 
at ... 

を得る私のコードです:

MyProgram.cs

public void InitMyObject(EventCallBack callBack) 
    System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(DLL_PATH); 
    Type type = assembly.GetType(CLASS_NAME); 
    ConstructorInfo[] constructors = type.GetConstructors(); 
    if (type != null) 
    { 
     // empty constructor, works!!! 
     //return constructors[1].Invoke(new object[0]); 
     // This one gives InvalidArgument exception 
     return constructors[0].Invoke(new object[] {callBack}); 
    } 
    return null; 
} 

MyDllCallBackNameSpace.csファイルは両方のプロジェクト(.dllファイル& EXEプロジェクト)に追加されており、ドライブ上の同じ物理ファイルを参照します。しかし、私はそれがまだ異なって扱われると思う。なぜそれが動作していない、または任意の回避策のアイデア?

+0

必要な*具体的なコンストラクタを求めます。今、コンストラクタ[0]を使うことは、ダイスのロールです。代わりにType.GetConstructor()を使用し、 'new Type [] {typeof(EventCallback)}'を渡します。GetConstructorからnullを返すと、EventCallbackが複数のアセンブリに現れる問題があります。 –

答えて

0

私はこの購入移動MyDllCallBackNameSpace.csを別のdllに修正することができました。その後、私は両方のプロジェクトからそのDLLを参照しました。

0

ConstructorInfo.Invoke Method (Object[])のArgumentExceptionは、 "パラメータ配列には、このコンストラクタで受け入れられる型に一致する値が含まれていません。 constructors[0]を実行したときに期待するコンストラクタを取得していますか? GetConstructorsの代わりにConstructorInfo constructor = type.GetConstructor(new Type[] { typeof(EventCallback) });を試してください。

+0

'GetConstructor'はその場合nullを返します。私は同じタイプの 'EventCallback'引数を渡しています。私はまた、実行時に引数を動的に作成する必要があると思います。 – Caner

+0

'type callbackType = assembly.GetType(" EventCallBack ");を実行すると何が得られますか? ConstructorInfoコンストラクタ= type.GetConstructor(新しい型[] {callbackType}); '? – JamieSee

+0

'assembly.GetType(" EventCallBack ");'がnullを返します – Caner

関連する問題