You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:10:23