C#调用LLaMA.cpp编译的DLL遇System.AccessViolationException求助
解决LLaMA.NET调用LLaMA.cpp编译产物的内存访问异常问题
平台不匹配确实是引发该异常的核心原因,C#项目若使用Any CPU模式(默认会根据系统自动切换x86/x64),但LLaMA.cpp编译产物是单一平台(x86或x64),跨平台调用时会因内存布局不兼容触发内存访问错误,这个方向的排查是正确的。
可以通过CMake指定LLaMA.cpp的编译平台,以下是针对无CMake经验者的直观操作步骤:
- 打开CMake GUI工具(若未安装需先安装CMake):
- 选择LLaMA.cpp项目的源码根目录(你克隆的GitHub项目文件夹)
- 选择一个单独的构建目录(比如在源码目录下新建
build_x64文件夹,不要直接在源码目录内构建)
- 点击「Configure」按钮,在弹出的配置窗口中:
- 选择对应平台的生成器:
- 编译x64版本:选「Visual Studio 2022 Win64」(根据你的Visual Studio版本调整,比如2019选对应版本的Win64选项)
- 编译x86版本:选「Visual Studio 2022」(不带Win64后缀的选项)
- 点击「Finish」完成初始配置
- 选择对应平台的生成器:
- 配置完成后点击「Generate」,生成对应平台的Visual Studio工程文件
- 打开构建目录中的
.sln工程文件,切换到「Release」模式,点击「生成解决方案」,得到对应平台的llama.dll
- 打开CMake GUI工具(若未安装需先安装CMake):
配套调整C#项目:
- 打开LLaMA.NET测试项目的属性窗口,将「平台目标」设置为与LLaMA.cpp编译产物一致的平台(x64或x86),禁用Any CPU模式
- 确保项目中引用的
llama.dll是刚编译好的对应平台版本
额外检查点:
- 你当前的
DllImport声明中调用约定CallingConvention.Cdecl是正确的,LLaMA.cpp的函数均使用该约定,无需修改 - 确认
inputEmbeds数组初始化时的大小足够容纳tokenize后的结果,代码中inputEmbeds.Length作为n_max_tokens参数传递是正确的,避免因数组过小导致内存越界
- 你当前的
内容的提问来源于stack exchange,提问作者anthony_s
相关产品推荐
相关产品推荐

