gpt4 book ai didi

.net - 如何在 .NET 中实现共享内存?

转载 作者:行者123 更新时间:2023-12-03 14:44:01 25 4
gpt4 key购买 nike

我有一个 C++.NET 应用程序和一个 C#.NET 应用程序。我希望他们通过共享内存进行通信。

.NET 2.0 版怎么可能?

主要是想共享一个队列对象。

最佳答案

更新:嘿,here's a page我刚刚发现了一个完整的实现。

使用 C++/CLI,很容易按照普通的 C++ API 设置共享内存(C++/CLI 能够与托管和 native HEAP/内存引用进行交互)。然后可以使用 UnmanagedMemoryStream 将 Stream 对象公开给 C#。

我没有附加 .h 文件,但您可以相当容易地推断出 pmapped native typedef 的布局;)。您可能还想根据您的读取器/写入器用例评估 BufferedStream 的可能用途。代码来自一个我不再使用的项目,所以我不记得它的错误回归状态。

这是建立文件映射并公开 UnmanagedMemoryStream 的 C++/CLI 类;

public ref class MemMapp
{
public:
__clrcall MemMapp(String^ file)
{
map = NULL;

if(!File::Exists(file)) throw gcnew ApplicationException("Can not find file " + file);

marshal_context^ x = gcnew marshal_context();
const char *nname = x->marshal_as<const char*>(file);

map = (pmapped) malloc(sizeof(mapped));
ZeroMemory(map, sizeof(mapped));
map->name = strdup(nname);
InitMap(map);
}
void __clrcall MapBytes(long long loc, long length)
{
map->low = loc & 0xffffffff;
map->high = (loc >> 32) & 0xffffffff;
map->size = length & 0xffffffff;
if(!GetMapForFile(map))
throw gcnew ApplicationException("can not map range " + loc + " :" + length);

if(map->size = 0)
map->size = MAXMAX&0xffffffff;

}
UnmanagedMemoryStream ^View()
{
return gcnew UnmanagedMemoryStream((unsigned char *) map->blok, map->size, map->size, FileAccess::Read);
}
long long __clrcall FileSize()
{
DWORD high, low;
long long rv;

low = GetFileSize(map->hFile, &high);
maxmax = high;
maxmax << 32;
maxmax += low;

rv = high;
rv << 32;
rv = rv & low;
return rv;
}
property unsigned int MinBufSiz { unsigned int get() { return map->dwbufz; } }
property long long BufBase { long long get() { return (map->high << 32) + map->low; } }
property long long BufLim { long long get() { return ((map->high << 32) + map->low) + map->size; } }
property long long MAXMAX { long long get() { return maxmax; } }
static MemMapp() { }
__clrcall ~MemMapp() { if(map != NULL) { CloseMap(map); free(map->name); free(map); map = NULL; } }
protected:
__clrcall !MemMapp() { if(map != NULL) { CloseMap(map); free(map->name); free(map); map = NULL; } }
pmapped map;
long long maxmax;
};

至少这里是 CLoseMap……我刚刚找到它……它不是用/CLR 编译的
bool CloseMap(pmapped map)
{
if(map->blok != NULL) {
UnmapViewOfFile(map->blok);
map->blok = NULL;
}
if(map->hMap != INVALID_HANDLE_VALUE && map->hMap != NULL) {
CloseHandle(map->hMap);
map->hMap = INVALID_HANDLE_VALUE;
}
if(map->hFile != INVALID_HANDLE_VALUE && map->hFile != NULL) {
CloseHandle(map->hFile);
map->hFile = INVALID_HANDLE_VALUE;
}
return false;
}

关于.net - 如何在 .NET 中实现共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com