我试图弄清楚如何使用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);
}
}
}
答案 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");
}
...
}