AppDomain.Unload_MarshalByRefObject

本文介绍了一种使用C#通过反射机制获取指定程序集内类的字段信息的方法。通过创建临时的应用域并加载目标程序集,可以安全地获取到指定类的指定字段值。
        internal string GetClassInfo(string assemblyName, string className, string strField)
        {
            string ret = strField;
            if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
            {
                string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName;                 
                AppDomain ad = AppDomain.CreateDomain("Test Domain");
                ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(callingDomainName, "XXNamespace.ProxyObject");
                obj.LoadAssembly(assemblyName);
                //obj.Invoke("TestDll.Class1", "Test", "It's a test");
                ret = obj.GetClassInfo(className, strField);
                AppDomain.Unload(ad);
            }
            return ret;

        }



    class ProxyObject : MarshalByRefObject
    {
        Assembly assembly = null;
        public void LoadAssembly(string assemblyName)
        {
            assembly = Assembly.LoadFile(assemblyName);
        }

        public string GetClassInfo(string className, string strField)
        {            
            string ret = strField;
            Type type = assembly.GetType(className, true, true);
            if (type != null)
            {
                FieldInfo fieldinfo = type.GetField(strField, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
                //return (String)fieldinfo.GetValue(assembly);
                ret = (String)fieldinfo.GetValue(null);
            }
            return ret;
        }

        public bool Invoke(string fullClassName, string methodName, params Object[] args)
        {
            if (assembly == null)
                return false;
            Type tp = assembly.GetType(fullClassName);
            if (tp == null)
                return false;
            MethodInfo method = tp.GetMethod(methodName);
            if (method == null)
                return false;
            Object obj = Activator.CreateInstance(tp);
            method.Invoke(obj, args);
            return true;
        }
    } 

 

转载于:https://www.cnblogs.com/sky20080101/p/6600882.html

public static void InitMenu(Form mainForm) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) LanguageConfig.CurrentLanguageType = DictIBLL.Instance.CurrentLanguage; GlobalHelper.CurrentLanguage = LanguageConfig.CurrentLanguageType; MenuService.m__00A0 = mainForm; MenuService.m__00A0.Add(0, MenuService.m__00A0); MenuService.m__00A0.Add(MenuService.m__00A0.GetType().FullName, MenuService.m__00A0); MenuService.m__00A0 = MenuService.m__00A0.Controls.Find(_10C161DD_002D44FC_002D490D_002D8979_002DB5CC1BEAB6EF._205D(), searchAllChildren: true)[0] as Panel; MenuService.m__00A0 = MenuService.m__00A0.Controls.Find(_10C161DD_002D44FC_002D490D_002D8979_002DB5CC1BEAB6EF._205E(), searchAllChildren: true)[0] as ToolStrip; MenuService.m__1680 = MenuService.m__00A0.Controls.Find(_10C161DD_002D44FC_002D490D_002D8979_002DB5CC1BEAB6EF._205F(), searchAllChildren: true)[0] as ToolStrip; MenuService.m__00A0.Renderer = new _00A0(); MenuService.m__1680.Renderer = new _00A0(); MenuService.m__1680.Items.Clear(); MenuService.m__00A0 = (from P_0 in AppDomain.CurrentDomain.GetAssemblies() where P_0.FullName.Contains(_10C161DD_002D44FC_002D490D_002D8979_002DB5CC1BEAB6EF._1680_204F()) select P_0).ToList(); if (LoginInfo.IsDebug) { MenuList = MenuIBLL.Instance.GetSystemMenuList(); } else { MenuList = MenuIBLL.Instance.GetMenuListByRoleId(0); } ParentMenuList = (from P_0 in MenuList where P_0.ParentId == 0 orderby P_0.Sorting select P_0).ToList(); ParentMenuList.ForEach(delegate (MenuEntity P_0)dh
03-27
<think>好的,用户的问题是关于C#中InitMenu方法遇到的编译器生成的未知类型问题,涉及IL代码的解决方案。我需要先理解这个问题的背景。 首先,用户提到InitMenu方法,这通常与菜单初始化相关,可能是在Windows Forms或WPF应用程序中。编译器生成的未知类型可能指的是自动生成的代码,比如设计器文件或某些特性生成的类。当查看IL代码时,这些自动生成的类型可能不容易直接对应到源代码,导致困惑或错误。 接下来,用户提到IL代码,说明问题可能出现在反编译或分析中间语言时,无法识别某些类型。这时候需要检查几个方面:设计器文件是否正确生成,是否有部分代码被优化或混淆,或者是否使用了某些代码生成工具或框架导致类型无法识别。 根据引用[2],用户可能在处理控件设置时遇到问题,特别是ContextMenuStrip控件,这可能在设计器文件中生成相关代码。如果设计器文件未正确更新或存在错误,可能导致编译器生成未知类型。此外,引用[3]提到的代码重构和模块化也可能相关,需要检查代码结构是否合理,是否存在冗余或错误生成的代码。 解决方案方面,首先应检查设计器文件,确保自动生成的代码没有错误。清理和重新生成项目可以解决一些生成问题。如果问题依旧,可能需要手动检查IL代码中的类型,使用ildasm或反编译工具查看生成的类型来源。另外,检查项目引用和NuGet包是否完整,避免缺少依赖导致类型无法解析。 此外,用户可能需要检查是否使用了动态编译或反射来生成类型,这些情况下需要确保类型名称正确且存在。如果问题涉及第三方库,可能需要更新或重新安装相关包。 最后,确保代码中没有使用过时的特性或编译器指令,这些可能导致生成意外的IL代码。如果所有方法都尝试后问题仍存在,可能需要简化代码,逐步排除,定位具体引发问题的部分。</think>### C#中InitMenu方法遇到编译器生成未知类型的解决方案 在C#中,`InitMenu`方法通常与菜单初始化相关,若遇到编译器生成的未知类型问题(尤其是涉及IL代码时),可通过以下步骤排查和解决: --- #### **1. 理解问题背景** - **现象**:编译或反编译时提示"未知类型",但源代码中未明确定义该类型。 - **原因**:可能是由设计器自动生成代码、编译器优化(如闭包/迭代器)或第三方工具生成的中间代码引起[^2][^3]。 --- #### **2. 排查设计器生成代码** - **步骤**: 1. 在解决方案资源管理器中展开`YourForm.cs`,找到对应的`YourForm.Designer.cs`文件。 2. 检查`InitializeComponent`方法中与菜单相关的代码(如`ContextMenuStrip`控件)。 3. 确保设计器文件与窗体代码同步(右键设计器界面 → 查看代码)。 - **示例代码**: ```csharp // YourForm.Designer.cs private void InitializeComponent() { this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(); // ...其他控件初始化 } ``` > 若此处类型未正确引用(如`System.Windows.Forms`缺失),需检查项目引用。 --- #### **3. 处理编译器生成的类型** 若涉及闭包、迭代器或异步方法: - **分析IL代码**: - 使用工具查看生成的IL代码(如`ildasm.exe`或JetBrains dotPeek)。 - 查找类似`<>c__DisplayClass`或`<InitMenu>b__0`的编译器生成类型。 - **解决方案**: - 避免直接依赖编译器生成类型名称(因其不稳定)。 - 重构代码:将嵌套逻辑提取为独立方法,减少闭包使用。 --- #### **4. 检查第三方工具干扰** - **可能场景**: - 使用代码生成器(如T4模板)或AOP框架(如PostSharp)。 - 动态编译(如`CSharpCodeProvider`)。 - **应对措施**: - 检查生成代码的完整性。 - 更新工具版本或调整生成逻辑。 --- #### **5. 修复步骤总结** 1. **清理并重新生成项目**: ```bash msbuild /t:Clean msbuild /t:Build ``` 2. **验证引用完整性**: - 检查NuGet包和DLL引用是否缺失。 3. **简化代码**: - 注释可疑代码块,逐步排查问题点。 4. **检查编译器选项**: - 禁用优化(项目属性 → 生成 → 取消勾选"优化代码")。 --- #### **示例:处理闭包生成的类型** ```csharp // 原始代码(可能生成闭包类) private void InitMenu() { var counter = 0; menuItem.Click += (s, e) => { counter++; MessageBox.Show($"Clicked {counter} times"); }; } // 重构后(避免闭包) private int _counter = 0; private void MenuItem_Click(object sender, EventArgs e) { _counter++; MessageBox.Show($"Clicked {_counter} times"); } private void InitMenu() { menuItem.Click += MenuItem_Click; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值