如何获取加载到不同 AppDomain 中的 c# 程序集的内存基地址

问题描述

您可以使用如下代码获取加载到您的进程中的模块的内存基址:

ProcessModuleCollection pc = Process.GetCurrentProcess().Modules;
foreach(ProcessModule pm in pc)
{
        Console.WriteLine("The moduleName is " + pm.ModuleName);
        Console.WriteLine("The " + pm.ModuleName + "'s base address is: " + pm.BaseAddress);
}

不幸的是,这不适用于我的场景。我正在做的是创建一个新的和分离的 AppDomain(称为 Temporal)并使用它从磁盘加载程序集。然后,我只是执行加载的程序集中包含的一些函数。这将是包含所有这些逻辑的类的代码


    public class Loader : MarshalByRefObject
    {
        object CallInternal(string dll,string method,string[] parameters)
        {
            byte[] buffer = File.ReadAllBytes(dll);
            Assembly a = Assembly.Load(buffer);
            Type[] types = a.GetTypes();
            MethodInfo m = null;
            Type myType = null;
            foreach (var type in types)
            {

                m = type.getmethod(method);
                if (m != null)
                {
                    myType = type;
                    break;
                }
            }

            if (m != null && myType != null)
            {
                var myInstance = Activator.CreateInstance(myType);
                return m.Invoke(myInstance,new object[] { parameters });
            }
            else
            {
                return null;
            }
        }
        public static object Call(string dll,params string[] parameters)
        {
            AppDomain dom = AppDomain.CreateDomain("Temporal");
            Loader ld = (Loader)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName,typeof(Loader).FullName);
            object result = ld.CallInternal(dll,typename,method,parameters);
            return result;
        }

问题是,有没有办法在不执行某种内存扫描的情况下获取加载程序集的内存基址?您从 ProcessModuleCollection 获得的 Process.GetCurrentProcess().Modules显示 AppDomain Temporal 中加载的程序集。允许使用不安全和非托管代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)