.NET 嵌入式资源,将 IntPtr 获取到原始内存位置以用于非托管代码
.NET embedded resource, getting an IntPtr to the raw memory location for use in unmanaged code
我需要向指向 .NET 嵌入式资源的本机代码公开 void*
和 ulong size
值。
现在,我可以自己分配内存并复制数据(使用传统方法),但这些文件可能很大,所以我想尽可能避免这种情况。
有没有办法(通过原始指针)直接指向嵌入资源?是内存,还是可用于直接在文件系统上转到 .NET 库的偏移量?
根据一些测试,嵌入式资源被加载为 UnmanagedMemoryStream
... 所以:
//
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
,并且是 uint
32 位。
我需要向指向 .NET 嵌入式资源的本机代码公开 void*
和 ulong size
值。
现在,我可以自己分配内存并复制数据(使用传统方法),但这些文件可能很大,所以我想尽可能避免这种情况。
有没有办法(通过原始指针)直接指向嵌入资源?是内存,还是可用于直接在文件系统上转到 .NET 库的偏移量?
根据一些测试,嵌入式资源被加载为 UnmanagedMemoryStream
... 所以:
//
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
,并且是 uint
32 位。