C# 使用反射和传递委托动态链接dll
我想动态加载dll并构造一个C# 使用反射和传递委托动态链接dll,c#,reflection,C#,Reflection,我想动态加载dll并构造一个MyDllClass对象。我的代码大致如下(不相关的部分被剥离): MyDllClass.cs namespace MyDllNameSpace { public class MyDllClass { private EventCallBack m_DelegateCallBack = null; public MyDllClass(EventCallBack eventCallBack) {
MyDllClass
对象。我的代码大致如下(不相关的部分被剥离):
MyDllClass.cs
namespace MyDllNameSpace
{
public class MyDllClass
{
private EventCallBack m_DelegateCallBack = null;
public MyDllClass(EventCallBack eventCallBack)
{
m_DelegateCallBack = eventCallBack;
}
public MyDllClass()
{
}
...
}
}
namespace MyDllCallBackNameSpace
{
public delegate void EventCallBack(string message);
}
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
namespace MyDllNameSpace
{
public class MyDllClass
{
private EventCallBack m_DelegateCallBack = null;
public MyDllClass(EventCallBack eventCallBack)
{
m_DelegateCallBack = eventCallBack;
}
public MyDllClass()
{
}
...
}
}
namespace MyDllCallBackNameSpace
{
public delegate void EventCallBack(string message);
}
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;
}
我设法使用空构造函数构造对象,但无法让其他构造函数工作。我得到ArgumentException
at System.Reflection.RuntimeConstructorInfo.InternalInvoke()
at System.Reflection.RuntimeConstructorInfo.Invoke()
at System.Reflection.ConstructorInfo.Invoke() at MyProgram.InitMyObject()
at ...
这是我的密码:
MyProgram.cs
namespace MyDllNameSpace
{
public class MyDllClass
{
private EventCallBack m_DelegateCallBack = null;
public MyDllClass(EventCallBack eventCallBack)
{
m_DelegateCallBack = eventCallBack;
}
public MyDllClass()
{
}
...
}
}
namespace MyDllCallBackNameSpace
{
public delegate void EventCallBack(string message);
}
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项目),并引用了我驱动器上的同一个物理文件。但我怀疑它仍然被视为不同的东西。您知道它为什么不起作用,或者有什么解决办法吗?Arguments的例外情况是,“参数数组不包含与此构造函数接受的类型匹配的值。”您确定在使用构造函数[0]
时得到了预期的构造函数吗?尝试ConstructorInfo constructor=type.GetConstructor(新类型[]{typeof(EventCallback)})
而不是getconstructor。我通过将MyDllCallBackNameSpace.cs移动到另一个dll中,成功地解决了这个问题。然后我引用了两个项目中的dll。GetConstructor
在这种情况下返回null。尽管我正在传递相同类型的EventCallback
参数。我想我还需要在运行时动态创建参数;ConstructorInfo构造函数=type.GetConstructor(新类型[]{callbackType})代码>?assembly.GetType(“EventCallBack”)代码>返回null,请尝试使用完整的命名空间。询问所需的特定构造函数。现在,使用构造函数[0]是一个赌注。改为使用Type.GetConstructor(),并传递新类型[]{typeof(EventCallback)}
如果从GetConstructor返回null,则EventCallback出现在多个程序集中。