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]を使うことは、ダイスのロールです。代わりにType.GetConstructor()を使用し、 'new Type [] {typeof(EventCallback)}'を渡します。GetConstructorからnullを返すと、EventCallbackが複数のアセンブリに現れる問題があります。 –