从.Net Framework项目引用.Net Standard GDAL库报错如何解决?
GDAL.Core跨框架引用报错解决方案
问题场景:引用了Gdal.Core 2.3的.NET Standard 2.0类库,在.NET 5+项目可正常运行,但在.NET Framework 4.7.2项目中引用时先后出现
Gdal.Core dll not found、Unable to find an entry point named 'CSharp_OSGeofGDAL_AllRegister___'报错
- 第一步:修正.NET Framework项目兼容配置
确认.NET Framework 4.7.2项目的app.config/web.config中已添加.NET Standard绑定重定向,在<runtime>节点下插入如下配置:
同时打开项目属性的「生成」页签,将平台目标统一设置为x64或x86,禁用Any CPU模式,GDAL原生绑定与平台强相关,平台不匹配会直接导致dll加载失败。<dependentAssembly> <assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.0.0.0" /> </dependentAssembly> - 第二步:统一使用NuGet管理依赖
禁止手动复制Gdal.Core.dll到.NET Framework项目,在.NET Standard类库和.NET Framework 4.7.2项目中同时安装相同版本的MaxRev.Gdal.Core包,NuGet会自动处理原生依赖的复制逻辑,无需手动干预。2.3版本官方GDAL包对.NET Framework的.NET Standard兼容支持存在已知缺陷,更换为社区维护的MaxRev分支可解决多数兼容问题。 - 第三步:调整GDAL初始化逻辑
在.NET Framework项目的入口位置(如控制台项目Program.cs的Main方法开头、Web项目Global.asax的Application_Start方法中),显式配置GDAL路径后再执行初始化:using OSGeo.GDAL; using OSGeo.OGR; using System.IO; using System; // 初始化代码 Gdal.SetConfigOption("GDAL_DATA", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gdaldata")); Gdal.AllRegister(); Ogr.RegisterAll(); - 第四步:排查原生依赖缺失问题
如果仍出现入口点找不到报错,检查项目输出目录下是否存在gdal_wrap.dll文件:该文件是承载C#调用入口的核心原生依赖,Gdal.Core.dll仅为托管层封装,该文件缺失或版本不匹配会直接触发入口点异常。如果输出目录没有该文件,可在.NET Framework项目中额外安装对应平台的MaxRev.Gdal.WindowsRuntime包。
内容的提问来源于stack exchange,提问作者SandiaDeDia
相关产品推荐
相关产品推荐

