C#调用C++ DLL动态库的教程

5星 · 超过95%的资源 需积分: 9 6 下载量 63 浏览量 更新于2024-07-28 收藏 58KB DOCX 举报
"这篇文章主要介绍了如何在C#中调用C++编译的DLL动态链接库,对于初学者或者需要跨语言代码复用的开发者来说非常有帮助。C++的DLL函数通过`extern "C"`进行声明,确保C#能够正确识别。C#则通过使用`DllImport`属性来导入并调用DLL中的函数。" 在C++中,我们可以创建一个动态链接库(DLL)来封装特定的功能,然后在其他语言中,如C#,调用这些功能。在这个例子中,C++的DLL包含了一个名为`average`的函数,用于计算整数数组的平均值。C++函数的声明如下: ```cpp extern "C" __declspec(dllexport) __cdecl int average(int* av); ``` `extern "C"` 关键字使得函数遵循C语言的链接规则,避免了C++的名称修饰(name mangling),这样C#才能正确识别函数。`__declspec(dllexport)` 表明这个函数需要导出到DLL中,`__cdecl` 是调用约定,表示参数由调用者清理。 C#调用这个C++ DLL的方法是使用`DllImport`属性,该属性允许我们指定DLL的路径、函数名、调用约定等。在C#中,调用`average`函数的代码可能如下所示: ```csharp using System; using System.Runtime.InteropServices; public class Program { [DllImport("your_dll_name.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int average([MarshalAs(UnmanagedType.LPArray)] int[] av); public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; double avg = (double)average(numbers) / numbers.Length; Console.WriteLine($"Average: {avg}"); } } ``` 在这里,`DllImport` 属性标记在静态方法上,`dllName` 参数指定了DLL的名称,`CallingConvention` 参数设为 `CallingConvention.Cdecl` 以匹配C++的调用约定。`UnmanagedType.LPArray` 表示数组参数的 Marshaling 类型,确保C#的数组可以正确传递给C++函数。 `DllImport` 属性还提供了其他参数,如 `CharSet` 控制字符集,`EntryPoint` 指定函数在DLL中的具体名称,`ExactSpelling` 确保函数名匹配,`PreserveSig` 保持方法签名不变,以及 `SetLastError` 是否记录错误信息等。这些参数可以根据实际情况灵活调整,以确保跨语言调用的正确性。 总结起来,C#调用C++ DLL的关键在于理解C++的DLL导出和C#的`DllImport`属性的使用,以及两者之间的类型映射和调用约定。通过这种方式,可以充分利用已有的C++代码,提高代码复用性,同时也能在不同语言之间进行有效的协作。