『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

Star-CCM+物理连续体设置全攻略:从模型选择到初始条件配置(附2402版实战截图) 本文详细解析了Star-CCM+中物理连续体的配置方法,从基础概念到高阶参数优化,涵盖模型选择、湍流模型对比、初始条件设置及2402版新特性应用。通过实战案例和配置策略,帮助工程师高效完成CFD仿真设置,提升计算精度与效率。特别适合需要处理复杂流体问题的专业人士参考。 阅读详情

『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

最近需要在.NET 4的环境中调用GDAL库。GDAL本身是一套非托管类库,不过还好提供了用SWIG做的托管的Wrapper。

可以在FWTools的安装包中找到这些Wrapper的编译好的dll文件,不过FWTools中附带的版本依赖于gdal_fw.dll(gdal_fw.dll是GDAL核心类库的修改版),而gdal_fw.dll依赖的其他非托管程序集太多了,加起来有18M左右。所以还是自己下载代码编译的好。

这篇文章介绍了1.4版本的下载和编译方法,该方法同样适用于现在最新的1.7版本。

编译好之后引用、调用、Debug都没问题,一切正常,但是如果用Release编译并在VS之外运行的话则会报出AccessViolationException,异常信息提示说访问了受保护的内存。我的第一反应就是托管的Wrapper中用P/Invoke调用了非托管程序集,而非托管程序集导致了这个问题。但是这个猜测并不能解释为什么只有在.NET 4+Release+IDE外运行的情况下才会出错的现象。

猜来猜去,找来找去找到了问题的所在:

GDAL的托管Wrapper中有一个叫做SWIGStringHelper的类型,该类型的静态构造方法中执行了一些比较重要的初始化操作。另外一个叫做OsrPINVOKE的类中声明了一个SWIGStringHelper类型的私有静态字段,并在声明时就new了该字段,而且OsrPINVOKE中没有显式声明的静态构造。

把这两个类型的代码简化一下的话,大概是这样的:


view sourceprint?01 class OsrPINVOKE 

02     { 

03         private static SWIGStringHelper helper = newSWIGStringHelper(); 

04    

05         public static void DoSomething() 

06         { 

07            Console.WriteLine("static method of OsrPINVOKE"); 

08         } 

09     } 

10    

11     class SWIGStringHelper 

12     { 

13         static SWIGStringHelper() 

14         { 

15            //这里做了一些重要的初始化 

16            Console.WriteLine("SWIGStringHelper static constructor"); 

17         }                                          

18 }


如果有代码调用DoSomething,这段代码执行顺序估计是这样的:

OsrPINVOKE的静态构造方法(里面初始化helper这个静态字段);

SWIGStringHelper的静态构造方法(输出字符串);

SWIGStringHelper的实例构造方法(里面啥也没有做);

DoSomething方法(输出字符串)。

所以应该是先输出SWIGStringHelperstatic constructor而后输出static method ofOsrPINVOKE。

试着用下面的代码调用一下:


view sourceprint?1 static void Main(string[] args) 

2         { 

3             OsrPINVOKE.DoSomething(); 

4             Console.ReadLine(); 

5         }


却发现如果用的target framework是.net4,用release编译并且在VS外运行的话,就会只输出static method of OsrPINVOKE,感觉好像SWIGStringHelper的静态构造方法没有执行。而如果用的是.net 2.0、3.5,或者是用Debug编译或是在VS里面运行的话输出结果都和预期的一致。

难道是静态字段的初始化在.NET 4中变成Lazy的了?

事实证明真的是这样:

如果一个类型提供了显式声明的静态构造的话,那么这个静态构造方法会在创建该类型实例或者访问该类型的任何静态成员之前被执行。

如果一个类型没有提供显式声明的静态构造的话,编译器会自动给该类型一个默认的静态构造,并把静态字段的初始化都放到该默认静态构造中去,而这个默认的静态构造只会在静态字段被访问时才执行,也就是说创建实例、调用实例方法、调用静态方法时都不会触发静态构造的执行(当然前提是它们没有访问静态字段)。

不过CLR在加载一个类型时怎么知道其中包含的静态构造方法是编译器加上的还是原C#代码中显式提供的呢?事实上这是beforefieldinit的作用。

根据上面的原则再来分析一下:OsrPINVOKE中没有显式声明的静态构造,所以编译器会生成一个默认的静态构造并把helper的实例创建放入其中。而这个默认的静态构造只会在helper这个唯一的静态字段被访问时才会执行。而代码中没有任何地方访问了helper,所以OsrPINVOKE的静态构造根本就没有执行,helper根本就没有被new出来,SWIGStringHelper的静态构造自然也就没有执行。

所以要解决这个问题的话只要在OsrPINVOKE里面显式声明一个静态构造方法,把new SWIGStringHelper();这一句放到里面,或者仅仅是显式声明一个静态构造并把它留空。然后重新编译一下GDAL的Wrapper就可以了。

如果您也在.NET 4中调用GDAL时遇到了类似的问题,不妨试一下这种解决方法。

其实不仅是GDAL,其他由SWIG制作的托管Wrapper估计都会受到影响。

参考:飞秋官网:http://www.freeeim.com/

Star CCM+2402 Linux系统级部署指南:glibc、HFV与无头模式实战 Star CCM+ 是面向工业级流体与多物理场仿真的高性能CAE平台,其核心依赖底层系统架构与运行时环境。理解glibc版本兼容性、硬件指纹校验(HFV)、MPI并行支持及OpenGL图形栈原理,是保障求解器稳定运行的技术前提。Star CCM+2402 强制采用浮动许可证与AVX-512指令集优化,显著提升CFD计算效率,但也抬高了Linux服务器部署门槛——从系统库版本、GPU驱动匹配到ulimit资源限制,任一环节缺失都将导致网格生成失败或求解器静默退出。典型应用场景包括汽车风阻仿真、电子散热建模与能 阅读详情

相关推荐

最新GDAL的C#版编译以及读写SHP中文乱码解决方案

在C#版的GDAL中,读写包含中文的shp文件时,会出现乱码的问题。解决此问题的最好办法就是重新编译GDAL 的C# API。并且GDAL官方提供的最新C#包中,是基于.NET Standard的。重新编译GDAL C# API也可以在需要的NET框架下使用GDAL。一举两得。

Const 2131

**Star CCM安装教程(linux环境下)*

如何在linux下安装并破解Star CCM+13.02.011? 目前网上大多是win上面安装STAR-CCM+ 的教程,关于linux的较少,我这里提供一篇在Ununtu上安装和破解的教程,供大家参考一下。 *1、 所需的文件 原版文件和破解文件,如下图所示 (下载链接可以私信我,不方便单独发) 2、 首先解压安装文件 使用命令 gzip -d STAR-CCM+13.02.011_01_li...

HelloWorld12111的博客 1万+

Unity 中使用GDAL库

GDAL(Geospatial Data Abstraction Library)是处理地理信息时很常用的一个开源库,功能强大,支持数据格式非常广泛。Unity是个很流行的三维游戏引擎,在地理信息行业做空间数据可视化也是个非常棒的工具。在实际工作中遇到的一个问题就是,怎么在Unity中引入GDAL的库,从而使用GDAL提供的API以及强大的功能。 Unity开发使用的是C#语言,基于开源的.NE...

qq_35037137的博客 839

Star-CCM+探针查看与创建

而除了上文采用快捷键“,”在显示器中显示点的标量场值或矢量场值,也可以通过添加注释的方法来进行显示。

2201_75375391的博客 4448

gdal依赖dll_请问.NET Core平台下调用GDAL库相关dll的问题

GDAL本身是C++编写的,通过DllImport / PINVOKE的方式封装为C#可以调用的类:1)GdalPINVOKE中引入gdal_wrap.dll:[DllImport("gdal_wrap", EntryPoint="CSharp_SetConfigOption")]public static extern void SetConfigOption(string jarg1, str...

weixin_28327051的博客 691

C#地理数据处理库整合实战:GDAL+HDF4+HDF5+netCDF

GDAL(Geospatial Data Abstraction Library)是一个用于处理栅格和矢量地理空间数据的开源库,广泛应用于遥感、地理信息系统(GIS)及科学数据处理领域。其核心架构采用面向对象设计,支持超过100种空间数据格式的读写与转换。在C#开发环境中,GDAL通过SWIG生成的绑定库实现集成,开发者可通过Gdal和Ogr命名空间访问底层功能。使用前需注册驱动:此代码用于初始化GDAL环境并注册所有支持的格式驱动,是调用任何GDAL功能的前提。

weixin_35903223的博客 1355

Star-CCM+负体积网格检查与出现原因

系统将报告零或负体积网格单元的总数,以及一条指出网格无效的信息。要检查体网格是否有零或负体积网格单元,可以运行网格诊断报告或初始化求解。要使网格可用于有限体积计算,每个网格单元必须具有正体积,否则初始化过程将失败,且模拟计算无法运行。负体积网格单元可能会以多种不同的方式出现,但必须修复或从网格中移除,才能继续执行任何后续操作。出现负体积网格的原因有很多种。

2201_75375391的博客 3900

C#编译的GDAL(支持HDF4+HDA5)

压缩文件下,包含VS2010编译的32位的GDAL,支持HDF2.4.6/HDF5-1.8.7(swig1.3.39),修正了常见的错误,亲测可用!如果需要添加其他库,可根据文档进行相关编译,附有编译过程中常见错误的修改文档。

在.NET 4中调用GDAL库时遇到的问题及解决方法

在.NET 4中调用GDAL库时遇到的问题及解决方法. .NET 4中类型初始化的改变导致的问题。

My diary 1560

基于gdal用c#读取hdf4文件的方法及相关DLL

基于gdal用c#读取hdf4文件的方法及相关DLL

GDAL2.2.2+HDF4+HDF5+netCDF——for C#

GDAL2.2.2库集成了对hdf4和hdf5以及netCDF文件支持,可用于C#编写对栅格数据,矢量数据的处理。

.NET6使用GDAL.Core中文乱码问题及解决方法

GDAL是一个处理矢量和栅格的GIS库,就算不是学GIS的,里面处理图像的方法也很有用,而.NET6则是最新的.NET框架,由.NET Core3、.NET5发展而来。本文总结了在.NET6项目下使用Gdal.Core遇到的一些编码问题以及解决方案。

lc156845259的博客 2179

MATLAB射线追踪算法实战:从零搭建通信信号传播模型(附完整代码)

本文提供了一份详细的MATLAB射线追踪算法实战指南,指导读者从零开始搭建通信信号传播模型。内容涵盖场景建模、射线发射、路径追踪与信号计算等核心环节,并附有完整代码,帮助通信与电子工程领域的学习者和工程师快速掌握这一精确模拟电磁波传播的关键技术。

weixin_29092031的博客 199

python的gdal库说明_GDAL库学习笔记(一): GDAL库介绍

可能你不玩GIS,不懂这个库到底有什么用,或者和python有什么关系。但是你要玩GIS,RS,你就应当知道这个库的价值。就算你不玩GIS,我想这个库对你也应该有致命的吸引力。为什么?看下面的介绍吧!先看看这段GDAL主页上的英文介绍吧!is a translator library for raster geospatial data formats that isreleased under ...

weixin_39771791的博客 5095

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2425

3款主流AIGC模型部署方案对比:本地、云端与混合架构的成本与性能分析

本文对比分析了3种主流AIGC模型部署方案(本地、云端与混合架构)的成本与性能差异,帮助企业在预算、性能和维护复杂度之间找到最佳平衡点。通过实际案例和详细数据,展示了不同部署方式在延迟、扩展性、数据隐私等方面的优劣势,为技术决策者提供实用参考。

weixin_33158887的博客 373

GDAL.NETCore 项目常见问题解决方案

GDAL.NETCore 项目常见问题解决方案 项目基础介绍 GDAL.NETCore 是一个开源项目,旨在为 .NET 应用程序提供 GDAL 3.x 的 C#/F# 绑定。该项目通过构建一个简单的构建引擎,使得用户无需在系统中安装庞大的 GDAL 二进制文件即可使用 GDAL 库。它提供了核心库和运行时库的 NuGet 包,以方便开发者在不同的运行时环境中使用。 **主要编程语言:**C#、F...

gitblog_00428的博客 366

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 539

【亲测免费】 使用C调用GDAL库读取GeoTIFF高程数据

使用C#调用GDAL库读取GeoTIFF高程数据 【下载地址】使用C调用GDAL库读取GeoTIFF高程数据分享 本文档旨在介绍如何利用C#编程语言结合GDAL(Geospatial Data Abstraction Library)库来高效地读取GeoTIFF格式的高程数据。GeoTIFF是一种广泛应用于地理信息系统中...

gitblog_06636的博客 1053

华为路由器 VRRP主备配置

3、R3 出口路由器。

一直被模仿,从未被超越 5590

DiffusionDriveV2 (1) : 端到端自动驾驶中受强化学习约束的截断扩散建模

DiffusionDriveV2:强化学习约束的截断扩散模型在端到端自动驾驶中的应用 本文针对端到端自动驾驶中扩散模型面临的模式崩溃问题,提出DiffusionDriveV2框架。该方法通过引入强化学习约束,解决了DiffusionDrive依赖模仿学习导致的多样性与持续高质量之间的困境。主要创新包括: 采用尺度自适应乘法噪声促进广泛探索 提出锚点内GRPO管理单个锚点样本间的优势估计 设计锚点间截断GRPO整合全局视角,避免不同驾驶意图间的不当比较 实验表明,该方法在NAVSIM基准测试中达到最先进水平(

@bangbang的博客 382

net core中引用GDAL

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp2.1</TargetFramework><!-- <RestoreSources>.\bin\Debu...

weixin_30522183的博客 598

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 579

GDAL C#版本 "安全透明方法"问题解决方案

之前写过一篇关于再C#中调用GDAL库出现OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常的解决方案,博客地址见下: http://blog.csdn.net/liminlu0314/article/details/7506101但是解决完该问题之后,还会出现下面的问题: “安全透明方法“OSGeo.GDAL.Gdal.AllRegister()”尝试通过方法“OSGeo

GDAL专栏 5525

【电源专题】LDO基础——热性能2

对于LDO散热而言,选择合适的元件并不是一件简单的任务。为了实现高效、尺寸得当并成本低的散热解决方案,我们在早期设计阶段就需要确保所有器件都可用并且已经考虑到元件和各种特性。

一点硬件 895

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 『飞秋』Html.Label的缺陷及补救办法
下一篇: 『飞秋』关于ASP.NET MVC+Repository+Service架构的一些思考
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值