|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?比来一向被C#挪用Haskell时的“实验读取或写进受回护的内存”成绩所困扰(详见C#挪用haskell遭受Attemptedtoreadorwriteprotectedmemory,C#挪用haskell时的“实验读取或写进受回护的内存”成绩),并且困在个中,越陷超深,没法自拔,差点弃用C#办理我们面对的成绩。
成绩是如许的,只需在Haskell代码中对字符串举行操纵,在C#挪用时就会激发非常:AnunhandledexceptionoftypeSystem.AccessViolationExceptionoccurredinUnknownModule.
Additionalinformation:Attemptedtoreadorwriteprotectedmemory.Thisisoftenanindicationthatothermemoryiscorrupt. 示例Haskell代码以下:
假如间接前往字符串,则统统一般,示例Haskell代码以下:
C#挪用示例代码:
- classNative{[DllImport("libpandoc",CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Unicode)]publicstaticexternIntPtrmarkdownToHtml(byte[]markdown);}publicclassProcessor{publicstringProcess(stringtext){varintPtr=Native.markdownToHtml(System.Text.Encoding.UTF8.GetBytes(text));varhtml=Marshal.PtrToStringAnsi(intPtr);returnhtml;}}
复制代码
你大概会问——吃饱撑着了,为何要用C#挪用Haskell?
没撑着!由于史上最壮大的Markdown引擎pandoc就是用Haskell开辟的,不是C#,不是Java,不是PHP,不是Python,也不是C/C++,更不是Objective-C。真正要比的不是言语,并且是用言语开辟出来的工具。
你大概要问——良多人看不起的微软家的C#能挪用高上年夜的Haskell?
固然能!并且经由了实践考证,详见经由实践考证的C#挪用Haskell的办法。固然是经由过程FFI(ForeignFunctionInterface),借助C编译成非托管的dll,但不论怎样,C#做到了。
但当我们用C#挪用Haskell办理实践成绩时,遭受了“Attemptedtoreadorwriteprotectedmemory.”成绩,重复折腾找不到办理之道,处于失望中,觉得“C#能够挪用Hakell"是一个“圈套”。
。。。
明天上午,当我们把编译好的程序从WindowsServer2008R2复制到WindowsServer2012上运转时,事业居然呈现了——运转一般,而且失掉了准确的了局。
这时候你大概又要问——不是自找贫苦吗,为何纷歧入手下手就用WindowsServer2012?
不是自找贫苦,是贫苦本人找上门的。由于编译Haskell代码必要安装HaskellPlatform(集成了ghc),而HaskellPlatform不克不及在WindowsServer2012一般安装,只能自愿在WindowsServer2008上安装(事先也被折腾了)。
切切没有想到的是,WindowsServer2008上编译出来的程序不克不及在WindowsServer2008上一般运转,却事业般地能在WindowsServer2012上能一般运转。这是否是Windows的一个坑呢?
由此想到我们在阿里云上已经遭受的“玄色10秒”成绩,是由于WindowsServer2008在WAS(WindowsProcessActivationService)中利用了spinlock,而假造化手艺对spinlock撑持欠好,终极也是经由过程换用WindowsServer2012办理了成绩。这固然不克不及说是WindowsServer2008的一个坑,但申明了一点——利用WindowsServer,2008要当心!
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着! |
|