.NET 7预览版CharSet迁移致编译失败求助
解决思路与方案
1. 先搞定CharSet的引用问题
如果你的项目是目标.NET 7及以上版本,别去NuGet找System.Runtime了——这个程序集是.NET SDK自带的,根本不需要额外安装。直接在代码顶部加正确的命名空间引用就行:
using System.Runtime.InteropServices;
要是你项目还在用.NET Standard或者.NET Framework,那确实没法用.NET 7的UnmanagedCallersOnlyAttribute,建议直接把项目框架升级到.NET 7+,省得折腾兼容问题。
2. 核心问题:string不是blittable类型
你说只能用blittable类型,但直接写string参数本身就不符合要求,就算CharSet的问题解决了,编译还是会报错。正确的做法是用IntPtr当参数,在函数内部再转成C#字符串:
using System.Runtime.InteropServices; [UnmanagedCallersOnly(EntryPoint = "eval")] public static void eval(IntPtr ctPtr, IntPtr parmsPtr) { // 用Unicode编码解析非托管字符串,对应原来的CharSet.Unicode string ct = Marshal.PtrToStringUni(ctPtr); string parms = Marshal.PtrToStringUni(parmsPtr); // 这里写你的业务逻辑 ... }
这种写法完全符合blittable类型要求,也不用再指定CharSet参数。
3. 实在没法升级框架?用第三方库
要是项目框架没法升级,就用DllExport这个第三方库(直接NuGet安装就行),它对旧框架支持更好,还能直接用string参数并指定字符集:
using RGiesecke.DllExport; [DllExport("eval", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public static void eval(string ct, string parms) { // 你的业务逻辑代码 ... }
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

