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