测试工具功能需求:支持用户选择待测试解决方案版本并调用其方法
实现动态选择待测试版本的解决方案
嘿,这个需求其实很清晰——咱们要把原来硬绑定的本地待测试程序集,改成用户可选择的动态加载模式。下面是一步步的具体实现方案:
1. 用OpenFileDialog让用户选择目标程序集
先加个触发控件(比如按钮),弹出文件选择框让用户挑最新版本的.dll或.exe:
using System.Windows.Forms; private void SelectTestAssemblyBtn_Click(object sender, EventArgs e) { using var openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "程序集文件 (*.dll;*.exe)|*.dll;*.exe|所有文件 (*.*)|*.*"; openFileDialog.Title = "选择待测试的解决方案版本"; if (openFileDialog.ShowDialog() == DialogResult.OK) { // 获取选中文件路径,进入加载调用环节 LoadTestAssemblyAndInvoke(openFileDialog.FileName); } }
如果是WPF项目,就用Microsoft.Win32.OpenFileDialog,用法差不多~
2. 动态加载程序集并调用同名方法
这一步是核心:通过反射加载选中的程序集,定位到咱们要测试的类型和方法(因为你说方法名不变,直接硬编码就行):
using System.Reflection; private void LoadTestAssemblyAndInvoke(string assemblyPath) { try { // 加载目标程序集 var targetAssembly = Assembly.LoadFrom(assemblyPath); // 替换成你待测试类的完整命名空间+类名,比如"TestApp.Core.BusinessService" var testClassType = targetAssembly.GetType("YourTestNamespace.YourTestClass"); if (testClassType == null) { MessageBox.Show("没找到目标测试类,检查下程序集版本是否匹配!"); return; } // 如果是静态方法,跳过实例化这一步 var testClassInstance = Activator.CreateInstance(testClassType); // 替换成你要调用的方法名,有参的话要传参数类型数组,比如new[] { typeof(string), typeof(int) } var testMethod = testClassType.GetMethod("YourTestMethodName"); if (testMethod == null) { MessageBox.Show("目标测试方法不存在,请确认方法名是否一致!"); return; } // 调用方法,有参就把null换成参数数组,比如new object[] { "test", 123 } var methodResult = testMethod.Invoke(testClassInstance, null); // 处理返回结果(按需调整) MessageBox.Show($"测试方法调用成功!结果:{methodResult?.ToString() ?? "无返回值"}"); } catch (Exception ex) { MessageBox.Show($"加载或调用出错:{ex.Message}"); } }
3. 几个要注意的点
- 保持类型/方法的一致性:既然你说方法名不变,最好确保类的全名、方法的参数列表也别改,不然反射会找不到目标。如果参数有变动,得加兼容逻辑。
- 依赖文件要齐全:如果待测试程序集依赖其他DLL,这些文件得和选中的程序集在同一个文件夹里,不然加载会失败。
- 版本兼容:测试工具的.NET版本要和待测试程序集的版本匹配,比如工具用.NET 6,就别加载.NET Framework 4.8的程序集。
- 权限问题:如果程序集在受保护目录(比如Program Files),可能需要管理员权限才能加载。
这样改完,用户就能随时选择最新版本的待测试解决方案,完全不用动你原来的静态引用啦!
内容的提问来源于stack exchange,提问作者Mootchmonster
相关产品推荐
相关产品推荐

