微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何获取加载到不同 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 举报,一经查实,本站将立刻删除。