0
我有一个winform应用程序和一个服务DLL(C#),都在同一个解决方案和命名空间中。 我正在动态加载DLL,所以我可以在将来更新DLL。 主窗体从动态加载的DLL调用一个方法,并将其自身(this
)作为变量传递。如何从动态加载的DLL调用的方法引用调用窗体
守则主要形式:
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“知道”主窗体,以便它可以与其成员和方法进行交互? 有没有更好的方法来达到这个目标?
感谢您
我最终引用了exe的项目,正如你所建议的,它的工作原理。 出于好奇,起初我设法使用了反射(在我参考exe之前),并且我使用'type.GetMethod(“funcName”)在主窗体中调用了公共方法。调用(formObj,new object [] {} );',但我无法找到访问公众成员及其内在价值的方法。有没有办法? – Yoram
您可以使用'Type.GetMember','Type.GetField','Type.GetConstructor'等适当版本来访问属性,字段和方法......您还可以获得非公共方法(并且可以在外部调用它们)通过传递'BindingFlags'来指示你想要的可见性级别。 –
谢谢,我会试试看。 – Yoram