C# 使用反射和传递委托动态链接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) {

我想动态加载dll并构造一个
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出现在多个程序集中。