在应用启动之前在.NET中保留硬编码的内存映射地址

时间:2015-07-20 12:06:45

标签: c# dll unmanaged

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

MapViewOfFileEx()使用最后一个参数(lpBaseAddress)并在我们的例子中将其设置为0x08000000。如果你在dll中尽早调用初始化函数,这对所有c / c ++应用程序都没问题。 但是,在c#中,更大的应用程序在我们甚至有机会在自动生成的静态方法Main()中调用dll的init函数之前会分配大量内存。 (小c#控制台应用程序工作正常)。

有没有办法在启动.NET应用程序之前预先将区域0x08000000预分配到0x08400000,然后自动分配类和内容?那么在我们喜欢的任何时候将共享内存映射到0x08000000应该没有问题。

限制: 这里没有明显的解决方案。

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

0 个答案:

没有答案