C# 调用C++ dll传入 char*参数时候的注意点

C# 调用C++ dll传入 char*参数时候的注意点

在搞adb的源码的时候希望能修改一下adb.exe的源码给编译成dll给自己使用,
先说下adb的一些基本的运行原理吧。当使用adb去连接模拟器或者手机端的时候adb会先去检测自己的服务有没有开启,如果没有开启就重新启动一个adb.exe然后传入参数fork-server server来启动socket服务来和其他端通讯,也就是说你发命令的exe和服务端的exe不是同一个所以如果直接修改为dll的话就不能吧自己再启动一次作为服务端了,所以这里在它启动服务的地方修改启动exe的路径为另一个adb.exe作为服务端通讯,然后把自己这个编译为dll提供调用,然后就需要在C#调用的 时候传入另一个exe的路径。

  1. 当c导出函数参数为 char * 的时候C# 可以用string 和StringBuilder。传入都是没问题的,不过这里有个非常要注意的点,因为C#里面你new出来的 变量的地址其实不是一直固定的,也就是说当你传入给string和StringBuilder给C的导出函数的时候,你必须在这个函数里面把这个char * 用好,不然如果用 另一个const char * newstring 去指向上面的地址的时候,等你下次使用这个newstring 的时候 会发现里面内容已经不可描述,所以关键就是在C里面拿到C# 传入的变量的时候要么直接使用,要么在C这边new 一个空间去保存这个内容,用C里面的指针指向这个新的空间,不然等你下次使用 C#里面的变量实际地址就已经变了。
### 回答1: 在 C#调用 C++ DLL 时,如果 DLL 中的函数接受一个 void* 类型的参数,可以使用 IntPtr 来代替。 例如,假设 C++ DLL 中有以下函数: ```cpp void MyFunction(void* data); ``` 在 C# 中可以这样调用: ```csharp [DllImport("mydll.dll")] public static extern void MyFunction(IntPtr data); // 调用 byte[] myData = new byte[100]; IntPtr ptr = Marshal.AllocHGlobal(myData.Length); Marshal.Copy(myData, 0, ptr, myData.Length); MyFunction(ptr); Marshal.FreeHGlobal(ptr); ``` 在上面的代码中,我们先使用 `Marshal.AllocHGlobal` 分配了一块内存,然后使用 `Marshal.Copy` 将数据拷贝到这个内存中。最后,我们将这个内存的指针传递给了 `MyFunction` 函数。调用结束后,我们需要使用 `Marshal.FreeHGlobal` 释放这块内存。 需要注意的是,void* 类型的参数C++ 中可以表示任何类型的指针,所以在 C#调用时需要确保传递的指针类型与 C++ 中期望的类型相同。 ### 回答2: C是一种常见的编程语言,最初由贝尔实验室的丹尼斯·里奇和肯·汤普逊开发出来。它是一种通用的、过程化的编程语言,具有高度可移植性和高效性。 C语言的设计目标是为了编写操作系统和系统软件,因此它具有很高的效率和灵活性。它提供了丰富的控制结构,如条件语句、循环语句和函数,使程序员能够更加精确地控制程序的执行流程。 C语言还具有强大的指针功能,可以直接访问和操作内存中的数据,这使得C语言在系统级编程中非常实用和强大。同时,C语言的指针也是学习其他高级编程语言的基础,例如C++和Java。 另外,C语言还具有广泛的应用领域。它可以用于开发图形界面应用程序、嵌入式系统、网络协议等等。由于C语言的高效性和可移植性,许多著名的软件和操作系统都是使用C语言编写的,如UNIX操作系统和Linux操作系统。 总之,C语言是一种强大而广泛应用的编程语言,具有高效性、可移植性和灵活性。无论是初学者还是专业开发者,在学习和应用C语言时都可以受益匪浅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值