Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序启动之前,在.NET中保留硬编码内存映射地址_C#_Dll_Unmanaged - Fatal编程技术网

C# 在应用程序启动之前,在.NET中保留硬编码内存映射地址

C# 在应用程序启动之前,在.NET中保留硬编码内存映射地址,c#,dll,unmanaged,C#,Dll,Unmanaged,我们有一个C#.NET应用程序,它绑定到一个非托管的C dll。 C dll使用CreateFileMapping()和MapViewOffilex()与同一台计算机上的其他进程共享内存 MapViewOffilex()使用最后一个参数(lpBaseAddress),并在本例中将其设置为0x08000000。如果您足够早地调用dll中的初始化函数,这对于所有c/c++应用程序都是好的。 然而,在c#中,更大的应用程序甚至在我们有机会在自动生成的静态方法Main()中调用dll的init函数之前就

我们有一个C#.NET应用程序,它绑定到一个非托管的C dll。 C dll使用CreateFileMapping()和MapViewOffilex()与同一台计算机上的其他进程共享内存

MapViewOffilex()使用最后一个参数(lpBaseAddress),并在本例中将其设置为0x08000000。如果您足够早地调用dll中的初始化函数,这对于所有c/c++应用程序都是好的。 然而,在c#中,更大的应用程序甚至在我们有机会在自动生成的静态方法Main()中调用dll的init函数之前就分配了大量内存。(小型c#控制台应用程序工作正常)

在自动分配类和内容之前,是否有一种方法可以在.NET应用程序启动时预先分配0x0800000到0x08400000区域?那么,我们可以随时将共享内存映射到0x08000000,这应该没有问题

限制: 显而易见的解决方案不能应用于此

  • 不可能通过调用MapViewOfFile来使用动态分配的虚拟地址,因为这需要对当前在所有进程中使用绝对指针的C dll进行大量更改
  • 也不可能在所有进程之间协商公共基址,因为它们不会同时启动

Re:“所有进程之间的公共基址”;我认为每个进程都有自己的地址空间…?那么,它们怎么可能有一个共同的基址呢?所有进程都共享指向共享内存块内部结构的指针。因此,指向第二个整数(设为42UL)的指针的地址为0x08000004。只有当所有进程都具有相同的“虚拟”基址时,如果它们执行int my_var=*0x08000004,则会得到42UL。这在技术上是可能的。您必须在C++中编写一个非托管exe,在用ValualLoCube()保留地址空间后,动态加载CLR。然后,您可以在让该代码创建视图之前调用VirtualFree()。ICLRMetaHost是一种相互测试的方法,但不是完全轻量级的。我希望在.NET启动阶段能够访问一个init前钩子或类似的东西。我们目前对此问题的“解决方案”是,将共享内存地址移回0x40000000。这对于我们的C#应用程序来说已经足够晚了,因为内存从一开始就分配好了(至少在Win7中是这样)。让我们等到ASLR也会在这里启动。。。