C#托管类型转换成非托管门类

C#托管类型转换成非托管类型
比如
一个char[],怎么变成char型,或者char*?
取地址符在C#里好像不能对托管类型用。
------解决思路----------------------
C++里的 char* 对应C#里就是string 或stringBuider

你可以百度关键字 C++ *char C#
------解决思路----------------------
给你一个参考,这是我以前写加密狗时用的

这是C++的

// 4. 生成用户 ID
EXTERN_C int WINAPI RY2_GenUID(int handle, DWORD* uid, char* seed, int isProtect);
// 输入:
// handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。
// uid 输出参数,生成的用户 ID 从此参数返回
// seed 用户给出的用于生成用户 ID 的种子,这是一个最大长度可以是 64 个字节的字符串
// isProtect 用来指定此 Rockey2 是否可写,0 是可写,1 是不可写
#define ROCKEY2_DISABLE_WRITE_PROTECT 0
#define ROCKEY2_ENSABLE_WRITE_PROTECT 1
// 返回:
// 返回的是一个错误编码,具体含义请看下面的错误编码部分。

// ====================================================================

// 5. 读取加密锁内容
EXTERN_C int WINAPI RY2_Read(int handle, int block_index, char* buffer512);
// 输入:
// handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。
// block_index 块索引,指明要读取的是哪1个块,取值为(0-4)
// buffer512 读出块的缓冲区,因为每个块的长度固定为 512 个字节,所以这个
// buffer 的大小至少是 512 个字节
// 返回:
// 返回的是一个错误编码,具体含义请看下面的错误编码部分。

// ====================================================================

// 6. 写入加密锁内容
EXTERN_C int WINAPI RY2_Write(int handle, int block_index, char* buffer512);



这是C#定义的
   // 5. 读取加密锁内容
        [DllImport("Rockey2.dll", EntryPoint = "RY2_Read", SetLastError = true)]
        public static extern int Read(int handle, int block_index, StringBuilder buffer512);


  // 输入:
        // handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。
        // block_index 块索引,指明要读取的是哪1个块,取值为(0-4)
        // buffer512 读出块的缓冲区,因为每个块的长度固定为 512 个字节,所以这个
        // buffer 的大小至少是 512 个字节
        // 返回:
        // 返回的是一个错误编码,具体含义请看下面的错误编码部分。

        // 6. 写入加密锁内容
        [DllImport("Rockey2.dll", EntryPoint = "RY2_Write")]
        public static extern int Write(int handle, int block_index, string buffer512);
------解决思路----------------------
unsafe直接&取地址。
------解决思路----------------------
首先你的所谓非托管类型到底只是C#里的char*还是 C里的char*?两者是不一样的。

如果是前者,用unsafe关键字直接定义char*就可以了

如果是后者,首先用System.Text.Encoding.ASCII.GetBytes把你的char[]转为byte[],
然后用Marshal.AllocHGlobal申请byte[]同样大小的非托管内存块
接着用Marshal.Copy把你的托管byte[]拷贝到刚申请的IntPtr指向的非托管内存块。
这个IntPtr就是和C/C++等价的char*了。

最后记得用Marshal.FreeHGlobal释放你创建的非托管内存块。