Assembly.LoadFile设置后回调

时间:2018-06-29 13:59:50

标签: c#

我试图弄清楚如何使用Assembly.LoadFile动态加载DLL后如何设置回调。在下面的示例中,“ MyCallBackMethod”是一个非委托,因此它将不起作用。我已经创建了一个新的DLL,并且在两个项目中都引用了该DLL,并且可以传递该对象,但这是正确的方法吗?还是我忽略了一些简单的方法?

string fullDLLPath = @"C:\Code\MyTest\MyDLL.dll";
Assembly assembly = Assembly.LoadFile(fullDLLPath);
Type type = assembly.GetType("MyNameSpace.MyClass");
if (type != null)
{
    //get both the start and stop method 
    MethodInfo myMethod = type.GetMethod("MyMethod");
    if (myMethod != null)
    {
        object result = null;
        //create instance
        object classInstance = Activator.CreateInstance(type, null);

        //get all parameters
        ParameterInfo[] paramInfo = myMethod.GetParameters();
        object[] paramToPass = null;
        foreach (ParameterInfo pi in paramInfo)
        {
            paramToPass = new object[] { MyCallBackMethod };
            break;
        }

        result = myMethod.Invoke(classInstance, paramToPass);
        if (result != null)
        {
            Console.WriteLine(result);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我将只使用两个项目中都引用的第三个DLL。然后,我可以毫无问题地通过Object []传递该类。然后,DLL将其作为静态变量放入其自己的类中,并可以引用该DLL以便将消息发送回EXE。

EXE:

static public Logger.Textlog Logging { get; } = new Logger.Textlog();
...
foreach (ParameterInfo pi in paramInfo)
{
    paramToPass = new object[] { Logging };
}

DLL:

static public Logger.Textlog Logging { get; } = new Logger.Textlog();

public bool MyMethod(Logger.Textlog passedTextLog = null)
{
    if (passedTextLog != null) {
        Logging = passedTextLog;
        Logging.WriteLine(LOG_TRANSACTION, "Here");
    }

    ...
}