如题。。。。。
之前的那个帖子结了。。。

怎么把这里的char[]变成char*
------解决思路----------------------

楼主呀,你试过用string没?
C++里如果用char* 那C#里就能用string或StringBuider来表示他的参数。
------解决思路----------------------
给你一个参考,这是我以前写加密狗时用的
这是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);
------解决思路----------------------
如果是后者,首先用System.Text.Encoding.ASCII.GetBytes把你的char[]转为byte[],
然后用Marshal.AllocHGlobal申请byte[]同样大小的非托管内存块
接着用Marshal.Copy把你的托管byte[]拷贝到刚申请的IntPtr指向的非托管内存块。
这个IntPtr就是和C/C++等价的char*了。
最后记得用Marshal.FreeHGlobal释放你创建的非托管内存块。
声明为byte*或者IntPtr,不要用char*,.NET的托管char和C/C++的char是不一样的。前者是unicode的字符,后者是单个字节byte的别名