首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppDomain地址空间

AppDomain地址空间
EN

Stack Overflow用户
提问于 2012-08-21 04:28:19
回答 1查看 1.1K关注 0票数 16

首先,问题是: CLR规范是否保证在同一进程内的多个应用程序域中执行的代码将共享相同的地址空间?通过“共享地址空间”,我的意思是,指向在一个应用程序域中分配的内存的指针对于在同一进程中托管的所有应用程序域的读写都是有效的。

考虑这个说明问题的自包含示例:程序在单独的应用程序域中分配一个Worker对象。Worker为10,000个整数分配一个内存块,并用数据填充它。然后,程序跨应用程序域边界调用,以获取指向分配的块的指针,并验证它是否可以读取10,000个项目中的每一个。

代码语言:javascript
复制
using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace crossapp {
    public class Worker : MarshalByRefObject {
        private readonly IntPtr myData;
        public const int DataLength = 10000;
        public Worker() {
            Console.Error.WriteLine(
                "Memory allocation happens in app domain '{0}'"
            ,   Assembly.GetExecutingAssembly().FullName
            );
            myData = Marshal.AllocHGlobal(sizeof(int) * DataLength);
            unsafe {
                var ptr = (int*) myData.ToPointer();
                for (var i = 0 ; i != DataLength ; i++) {
                    ptr[i] = 2*i + 1;
                }
            }
        }
        public IntPtr GetData() {
            return myData;
        }
    }
    class Program {
        static void Main() {
            var ad = AppDomain.CreateDomain("New domain");
            var wrk = (Worker)ad.CreateInstanceAndUnwrap(
                Assembly.GetExecutingAssembly().FullName
            ,   "crossapp.Worker"
            );
            var data = wrk.GetData();
            var badCount = 0;
            unsafe {
                var ptr = (int*)data.ToPointer();
                for (var i = 0 ; i != Worker.DataLength ; i++) {
                    var expect = 2*i + 1;
                    if (ptr[i] != expect) {
                        Console.Error.WriteLine(
                            "Mismatch in position {0}: {1} != {2}"
                        ,   i, expect, ptr[i]
                        );
                        badCount++;
                    }
                }
                if (badCount == 0) {
                    Console.Error.WriteLine(
                        "All {0} items have matched."
                    ,   Worker.DataLength
                    );
                } else {
                    Console.Error.WriteLine(
                        "Found {0} mismatches out of {1}."
                    ,   badCount
                    ,   Worker.DataLength
                    );
                }
            }
        }
    }
}

我运行了很多次,每一次都很有效。直觉上,它应该是有效的:毕竟,应用程序域在单个进程中,因此它们必须共享相同的虚拟地址空间。然而,这感觉像是对微软随时可能取消的功能的利用。在CLR的规范中,有没有什么东西肯定或否定了这个技巧的合法性?

如果你想知道我为什么要问这样一个奇怪的问题,我正在寻找一种方法来传递大量(以am为单位)的应用程序域边界的数据,在空间和时间上的开销都是最小的。如果我能证明它的合法性,这将是我理想的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2012-08-21 04:47:38

我不能直接回答你。MarshalByRefObject的存在可能表示使用了公共地址空间,但也可能不是。

您还可以研究一下memory-mapped files

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12044648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档