c#发展

首页 » 常识 » 问答 » CSharp调用C创建DLL
TUhjnbcbe - 2025/7/23 18:01:00

本文描述用MicrosoftvisualC++6.0创建动态链接库(dll)文件,然后通过C#调用的全过程及C++与C#数据映射相关的知识。

首先使用MicrosoftvisualC++6.0创建动态链接库文件,示例文件名称为Win32Dll,被调方法定义如下图所示:

C++中定义的方法

通过MicrosoftvisualC++6.0将工程编译为dll文件,得到Win32Dll.dll。

下一步,将Win32Dll.dll复制到C#执行文件的目录下。

创建C#项目,调用C++动态链接库中的方法,C#代码如下:

C#测试代码

在C++中,Print方法有两个参数,参数类型分别是unsignedchar*和unsignedint,unsignedchar*p表示一个指向无符号字符数组的指针,在向Print函数传递参数时,第一个参数为一块byte类型的内存数组指针,C#里的这个指针用System.IntPtr定义。在C#中,Marshal.AllocHGlobal用于分配非托管内存。要填充这些内存单元,可以使用Marshal.WriteByte方法来逐字节填充,或者使用Marshal.Copy来复制一个字节数组到非托管内存中。

填充方法1示例如下:

intsize=;//假设我们需要分配字节的内存

IntPtrptr=Marshal.AllocHGlobal(size);//分配内存

for(inti=0;isize;i++)

{

Marshal.WriteByte(ptr,i,(byte)0xFF);//填充内存,这里用0xFF代替

}

//使用完毕后,记得释放内存

Marshal.FreeHGlobal(ptr);

填充方法2示例如下:

intsize=;//假设我们需要分配字节的内存

IntPtrptr=Marshal.AllocHGlobal(size);//分配内存

byte[]buffer=newbyte[size];//创建一个字节数组

for(inti=0;isize;i++)

{

buffer=0xFF;//填充数组,这里用0xFF代替

}

Marshal.Copy(buffer,0,ptr,size);//将字节数组复制到非托管内存

//使用完毕后,记得释放内存

Marshal.FreeHGlobal(ptr);

最后执行C#程序结果如下图所示:

C#调用C++中的方法输出结果#深度好文计划#
1
查看完整版本: CSharp调用C创建DLL