.NET嵌入式资源,将IntPtr移到原始内存位置以在非托管代码中使用

时间:2018-07-18 16:17:37

标签: .net pinvoke embedded-resource

我需要向指向.NET嵌入式资源的本机代码公开void*ulong size值。

现在,我可以自己分配内存并复制数据(使用传统方法),但是这些文件可能很大,所以我想避免这种情况。

是否有一种方法(通过原始指针)直接指向嵌入式资源?内存还是可以用于直接在文件系统上访问.NET库的偏移量?

1 个答案:

答案 0 :(得分:2)

根据一些测试,嵌入式资源将以UnmanagedMemoryStream的形式加载...因此:

// https://stackoverflow.com/a/917607/613130
UnmanagedMemoryStream stream = (UnmanagedMemoryStream)assembly.GetManifestResourceStream("DefaultNamespaceOfAssembly.FileName.jpg");
byte* ptr = stream.PositionPointer;
long length = stream.Length;

从参考源中的注释中,该操作不应分配任何内存(您获得的指针应该指向内存中加载的实际资源)。实际上,UnmanagedMemoryStream不会释放Dispose()上的任何内存。

请注意,您询问的ulong size有点可恶...我希望您能确定。 VC ++的unsigned long不是long,而size_t仅是64位的ulong,是32位的uint