急:请教C#中用DLL封装MDI子窗体的方法以及主窗体是如何调用?
急:请教C#2005中用DLL封装MDI子窗体的方法以及主窗体是如何调用?我的主窗体是单独的一个exe,MDI子窗体是在DLL中封装的,每个DLL都封装有三个子窗体(每次这三个子窗体都可以同时打开,相互访问其中方法的),目前我在EXE中的主窗体中定义了三个公用的窗体,在用反射创建(CreateInstance)这三个form窗体实例,在每个子窗体中的构造的函数中定义了主窗体的实例,本来是想着这样就可以互相访问之间的函数,结果由于在主窗体中定义的三个公用窗体并不知道每个子窗体的类型,这样都只是开始定义的form类了,就并不能访问每个子窗体中的方法了,只是访问主窗体中的方法?
请教各位高手有没有什么好的高招啊,我急着呢,先谢过了 --------------------编程问答-------------------- 我的做法是:把每个dll文件程序集和类名都保存到数据库或者在xml文件然后启动时候读取这些文件
用反射调用。另外基本上窗体都是集成于Form所以可以直接来做。
我这边提供vb.net代码
Dim StartPath As String = Application.StartupPath & "\" & paraName.Split("!")(0)
If Not File.Exists(StartPath) Then
SysFunction.clsFunction.funcMsg("此程序模块文件丢失!", MsgType.Information)
Exit Sub
End If
Dim t As Type = Assembly.LoadFile(StartPath).GetType(paraName.Replace(StrType, Me.StrFlag))
If t Is Nothing Then
SysFunction.clsFunction.funcMsg("此程序模块文件没有或者丢失!", MsgType.Information)
Exit Sub
End If
Dim bflag As Boolean = False
Dim iflag As Integer = 0
For i As Integer = 0 To Me.MdiChildren.Length - 1
If (Me.MdiChildren(i).Name = t.Name) Then
bflag = True
iflag = i
End If
Next
Dim f As Form
If Not bflag Then
f = Activator.CreateInstance(t)
f.Text = MenuName.Substring(0, MenuName.IndexOf("("))
f.MdiParent = Me
f.Dock = DockStyle.Fill
f.Show()
Else
f = Me.MdiChildren(iflag)
f.Focus()
End If --------------------编程问答-------------------- c#代码类似。如果不行请告诉我。 --------------------编程问答-------------------- 谢谢 楼上 naturalth 的回复了,
C#中用反射创建封装DLL用你上面提供的代码也是这样的,我之前也是这样做的,把我封装的DLL中的三个mdiForm 都是用像你上面说的这种方式,我保存在XML中的,创建后,也都是定义为 form ,就像你上面提到的 Dim f As Form,f,我是再增加了两个,假如为 Fb,Fc,而且都是public的,这个时候,我想在Fb中用到Fc中的方法,我是在f,Fb,Fc的构造函数中都把主窗体(FPar)加进去了,这样就可以用 FPar.f. 或是FPar.Fb. 访问其中的方法,但是这样就访问不了,因为定义的时候是As Form,他只能看到Form的公共属性与方法,请问:有没有什么办法可以访问这些窗体之间我们定义的他们各自的公有方法呢?谢了 --------------------编程问答-------------------- 你要动态调用你窗体里面的方法。我觉得用类似下面的可以。但是我觉得你当初设计是不是要考虑下?
private static string GetRuleReuslt(
object [] objFiveParas,
string FunctionName,
string ClassName,
int iParamsCout
)
{
if (FunctionName == "") return "";
//Assembly asm = Assembly.GetExecutingAssembly();
//QQQ
string class_path = AppDomain.CurrentDomain.BaseDirectory.ToString();
class_path = class_path + System.Web.Configuration.WebConfigurationManager.AppSettings["RuleManager.Path"];
Assembly asm = Assembly.LoadFile(class_path);
Type type = asm.GetType(ClassName);
if (type == null) return "";
object obj = null;
try
{
//MethodInfo info = type.GetMethod(FunctionName, BindingFlags.ExactBinding, null, new Type[0], new ParameterModifier[0]);
//MethodInfo info = type.GetMethod(FunctionName, BindingFlags.ExactBinding, new ParameterModifier());
MethodInfo info = type.GetMethod(FunctionName);
if (iParamsCout == 0)
obj = info.Invoke(null, null);
else
{
object[] inputParas = new object[iParamsCout];
for (int iobjcout = 0; iobjcout < iParamsCout; iobjcout++)
inputParas[iobjcout] = objFiveParas[iobjcout];
obj = info.Invoke(null, inputParas);
}
}
catch (Exception ex)
{
throw ex;
}
return obj.ToString();
} --------------------编程问答-------------------- 正在学习中 --------------------编程问答-------------------- 不同的窗体分别继承一个不同的接口,然后通过反射实例化不同的接口进行调用 --------------------编程问答-------------------- 很好,顶下~ --------------------编程问答-------------------- 不知道是否搞定了?
补充:.NET技术 , C#