VB.NET能否使用提取图片的同类方法从其他EXE提取My.Settings配置值
问题解答
可以用类似加载外部程序集的方式提取其他exe的My.Settings设置值,但你原有代码的资源寻址逻辑存在错误,调整方法如下:
错误点说明
- My.Settings对应的资源路径不是
{程序集名}.resources,VB.NET编译时会把My.Settings封装到{程序集名}.My.MySettings类中,不能用提取普通图片资源的ResourceManager路径寻址 - 你原有代码中直接读取普通资源的逻辑不适用于Settings,需要先获取MySettings的单例实例再读取对应属性
可用实现代码
Try Dim exePath As String = IO.Path.Combine(Application.StartupPath, PluginPath) Dim externalAssembly As Assembly = Assembly.LoadFile(exePath) Dim assemblyName As String = IO.Path.GetFileNameWithoutExtension(exePath) ' 定位外部程序集的MySettings类型 Dim settingsType = externalAssembly.GetType($"{assemblyName}.My.MySettings") If settingsType Is Nothing Then MsgBox("目标程序集未找到My.Settings定义") Return End If ' 获取MySettings的默认单例实例 Dim defaultInstanceProp = settingsType.GetProperty("Default", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Static) Dim settingsInstance = defaultInstanceProp.GetValue(Nothing) ' 读取指定设置项的值,替换成你要取的设置项名称即可 Dim targetSettingValue = settingsType.GetProperty("MyStringRefrenceName").GetValue(settingsInstance).ToString() ' 后续使用取值 MsgBox(targetSettingValue) Catch ex As Exception MsgBox("提取失败:" & ex.Message) End Try
注意事项
- 仅当目标exe的My.Settings设置项的访问修饰符为Public时可直接读取,如果是Friend修饰,需要你的程序和目标exe使用相同强签名、或者在目标项目的AssemblyInfo里配置
InternalsVisibleTo指定你的程序集名称才能读取 - 上述方法仅适用于.NET Framework编译的VB.NET exe,.NET Core/.NET 5+版本的VB.NET项目My.Settings存储逻辑有差异,需要额外适配
内容的提问来源于stack exchange,提问作者LabRat
相关产品推荐
相关产品推荐

