我有一个winform应用程序和一个服务DLL(C#),它们都在同一个解决方案和命名空间中。
我正在动态加载DLL,以便将来更新DLL。
主窗体从动态加载的DLL调用一个方法,并将自身(this
)作为变量传递。
主要表格中的代码:
namespace MyNamespace
{
class Form1
{
int i = 5;
// Code
.....
private void CallDllMethod()
{
try
{
Assembly assembly = Assembly.LoadFrom("DllName.dll");
Type type = assembly.GetType("MyNamespace.Class2");
object ClassObj = Activator.CreateInstance(type);
type.InvokeMember("DoSomething",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
ClassObj,
new object[] { this });
}
catch (Exception){...}
}
}
}
DLL中的代码:
namespace MyNamespace
{
public class Class2
{
public void DoSomething(Form1 obj)
{
...
}
}
}
它告诉我它不知道Form1 obj
,我想我理解为什么。
如何让dll“知道”主窗体,以便它可以与它的成员和方法进行交互? 有没有更好的方法来实现这一目标?
谢谢你
答案 0 :(得分:1)
为了在设计时获取成员,Dll需要引用exe的项目(或定义基类或接口的第3个项目,exe和dll引用)。
如果你不能这样做,你就会被反射用来召唤成员。
如果您只需要从dll访问基本表单成员,则可以将参数声明为Form
而不是Form1
。这可以让你调用像.Close
这样的东西。