使用PowerShell反射执行数据库更新及示例方案说明
解决你的.NET Framework 4.7 MVC Area控制器程序集操作问题
嘿,看了你在Database Area的Update控制器里写的代码,用Assembly.GetExecutingAssembly()来操作程序集是很常见的需求,但这里有时候会因为MVC的编译机制或者程序集加载逻辑踩坑,我给你几个实用的方案和注意点:
1. 更可靠的程序集获取方式
Assembly.GetExecutingAssembly()虽然能用,但如果你的Area代码后续移到单独类库,或者MVC视图编译生成了单独的程序集,可能会拿到不是你预期的程序集。更稳妥的方式是直接通过控制器类型来获取:
public static List<string> Execute() { var returnable = new List<string>(); // 用当前控制器的类型获取所属程序集,稳定性拉满 var assembly = typeof(UpdateController).Assembly; // 这里继续你的后续逻辑... return returnable; }
2. 读取嵌入资源的正确姿势
如果你的Execute方法是想读取项目里的嵌入资源(比如配置片段、文本模板),记得先把文件的生成操作设置为「嵌入的资源」(右键文件→属性里改),然后用下面的代码读取:
// 资源名称格式:[项目根命名空间].[Area名称].[资源所在文件夹].[文件名] // 比如你的项目叫MvcDemo,资源在Database Area的Resources文件夹下叫Config.txt var resourceName = "MvcDemo.Database.Resources.Config.txt"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream != null) { using (var reader = new StreamReader(stream)) { var content = reader.ReadToEnd(); returnable.Add(content); } } }
3. 调试程序集的小技巧
如果你不确定当前拿到的程序集是不是正确的,可以先在Execute里加两行调试代码:
returnable.Add($"当前程序集名称: {assembly.GetName().Name}"); returnable.Add($"程序集物理路径: {assembly.Location}");
然后在Index视图里把这个List
4. 处理程序集加载异常
如果遇到程序集找不到的情况,可以遍历当前AppDomain已加载的所有程序集来定位:
var targetAssembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(a => a.GetName().Name == "你的目标程序集名称"); if (targetAssembly != null) { // 用targetAssembly来执行后续操作 }
内容的提问来源于stack exchange,提问作者mckennawebdev
相关产品推荐
相关产品推荐

