c++调用 c# dll 通过 P/Invoke (详细避坑)
项目场景:
VS2022 .NET8 , 项目应用的库需要支持AOT,不支持AOT的库看这里
我的c++项目很奇怪,如果使用 clr 调用c# dll,会有很多报错,所以使用 P/Invoke方法,这个方法不会有任何奇怪的报错
解决方案
示例代码
using System.Runtime.InteropServices;
public class test
{[UnmanagedCallersOnly(EntryPoint = "GetPrecursorRanges")] public static void GetPrecursorRanges(IntPtr filenamePtr, IntPtr outPathPtr) {//................}[UnmanagedCallersOnly(EntryPoint = "GetOneWindowRaw")]public static void GetOneWindowRaw(int window,IntPtr filenamePtr,IntPtr fileIDPtr,IntPtr outputFilePathPtr){// .................}
}
vs要配置项目
打开项目的配置文件.csproj, 检查是不是X64平台, 还要添加 <PublishAot>true</PublishAot>
然后在vs中,生成解决方案,打开
把工作目录切换到项目中,比如这个路径,要看见csproj
然后输入 dotnet publish -p:NativeLib=Shared -r win-x64 -c Release
在这里面会提示一些基本的信息,和报错,一般是库的版本不支持P/Invoke,解决之后,正常运行出来会看见dll输出的目录,至此大功告成
但是这个方案会有局限,如果项目中调用了一些COM的库,是不能用此方案生成dll,这种情况的报错如下。
COM Interop requires ComWrapper instance registered for marshalling.
解决方案参考另外一篇用C++/CLI解决的